• 判定数据中是否包含某一属性的方法


    方法一、使用List

     
    
    1. public static boolean useList(String[] arr, String targetValue) {
    2.     return Arrays.asList(arr).contains(targetValue);
    3. }

    方法二、使用Set

    1. public static boolean useSet(String[] arr, String targetValue) {
    2.     Set set = new HashSet(Arrays.asList(arr));
    3.     return set.contains(targetValue);
    4. }

    方法三、使用循环判断

     
    
    1. public static boolean useLoop(String[] arr, String targetValue) {
    2.     for(String s: arr){
    3.         if(s.equals(targetValue)) {
    4.             return true;
    5.         }
    6.     }
    7.     return false;
    8. }

    方法四、使用Arrays.binarySearch()

    1. public static boolean useArraysBinarySearch(String[] arr, String targetValue) { 
    2.     int a =  Arrays.binarySearch(arr, targetValue);
    3.     if(a > 0) {
    4.         return true;
    5.     }else {
    6.         return false;
    7.     }
    8. }

    注意:Arrays.binarySearch()方法只能用于有序数组!!!

    方法五、使用Apache Commons类库中的ArrayUtils

    1. import org.apache.commons.lang3.ArrayUtils;
    2. public static boolean useArrayUtils(String[] arr, String targetValue) {
    3.     return ArrayUtils.contains(arr,targetValue);
    4. }

    其实Apache Commons类库中的ArrayUtils的contains方法的源码也是使用循环判断的方式。

    1. if(array == null) {
    2.  return -1;
    3. else {
    4.  if(startIndex < 0) {
    5.   startIndex = 0;
    6.     }
    7.     int i;
    8.     if(objectToFind == null) {
    9.   for(i = startIndex; i < array.length; ++i) {
    10.    if(array[i] == null) {
    11.     return i;
    12.    }
    13.   }
    14.  } else if(array.getClass().getComponentType().isInstance(objectToFind)) {
    15.   for(i = startIndex; i < array.length; ++i) {
    16.    if(objectToFind.equals(array[i])) {
    17.     return i;
    18.    }
    19.   }
    20.  }
    21.  return -1;
    22. }

    比较:我们可以通过下面的代码大概的得出各种方法的时间成本。基本思想就是从数组中查找某个值,数组的大小分别是5、1k、10k。这种方法得到的结果可能并不精确,但是是最简单清晰的方式。

     
    
    1. public static void main(String[] args) {
    2.     String[] arr = new String[] {  "1",  "2""3""4""5"};
    3.  
    4.  /*
    5.  String[] arr = new String[1000];
    6.  for(int i=1;i<=1000;i++) {
    7.   arr[i-1]=String.valueOf(i);
    8.  }
    9.  */
    10.   
    11.  /*
    12.  String[] arr = new String[10000];
    13.  for(int i=1;i<=10000;i++) {
    14.   arr[i-1]=String.valueOf(i);
    15.  }
    16.  */
    17.   
    18.     //use list
    19.     long startTime = System.nanoTime();
    20.     for (int i = 0; i < 100000; i++) {
    21.         useList(arr, "5");
    22.     }
    23.     long endTime = System.nanoTime();
    24.     long duration = endTime - startTime;
    25.     System.out.println("useList:  " + duration / 1000000);
    26.     //use set
    27.     startTime = System.nanoTime();
    28.     for (int i = 0; i < 100000; i++) {
    29.         useSet(arr, "5");
    30.     }
    31.     endTime = System.nanoTime();
    32.     duration = endTime - startTime;
    33.     System.out.println("useSet:  " + duration / 1000000);
    34.     //use loop
    35.     startTime = System.nanoTime();
    36.     for (int i = 0; i < 100000; i++) {
    37.         useLoop(arr, "5");
    38.     }
    39.     endTime = System.nanoTime();
    40.     duration = endTime - startTime;
    41.     System.out.println("useLoop:  " + duration / 1000000);
    42.     //use Arrays.binarySearch()
    43.     startTime = System.nanoTime();
    44.     for (int i = 0; i < 100000; i++) {
    45.         useArraysBinarySearch(arr, "5");
    46.     }
    47.     endTime = System.nanoTime();
    48.     duration = endTime - startTime;
    49.     System.out.println("useArrayBinary:  " + duration / 1000000);
    50.     //use useArrayUtils
    51.     startTime = System.nanoTime();
    52.     for (int i = 0; i < 100000; i++) {
    53.         useArrayUtils(arr, "5");
    54.     }
    55.     endTime = System.nanoTime();
    56.     duration = endTime - startTime;
    57.     System.out.println("useArrayUtils:  " + duration / 1000000);
    58. }

    数组长度为5时,运行结果如下:

     
    
    1. useList:  4

    2. useSet:  48

    3. useLoop:  3

    4. useArrayBinary:  4

    5. useArrayUtils:  16

    当数组长度为1k时,运行结果如下:

     
    
    1. useList:  97

    2. useSet:  1312

    3. useLoop:  78

    4. useArrayBinary:  6

    5. useArrayUtils:  97

    当数组长度为10k时,运行结果如下:

     
    
    1. useList:  1213

    2. useSet:  11697

    3. useLoop:  1165

    4. useArrayBinary:  7

    5. useArrayUtils:  1272

    总结:

    显然,使用一个简单的循环方法比使用任何集合都更加高效。

    大多数人为了方便,都使用第一种方法,但是他的效率相对较低。因为将数组压入Collection类型中,首先要将数组元素遍历一遍,然后再使用集合类做其他操作。

    如果使用Arrays.binarySearch()方法,数组必须是已排序的。所以当数组并没有进行排序,所以该方法不可使用。

  • 相关阅读:
    【Spring】Spring IOC & DI
    Java基于微信小程序的一起考研学习平台
    在Vue3中使用Element Plus Icon图标的几种方式
    安全防护的原则
    生信教程|替代模型选择
    图形库实战丨C语言扫雷小游戏(超2w字,附图片素材)
    python 绘制3D图
    PHP代码审计2—这些函数必知必会
    数据库基础---SQL语句(基于sql server的笔记)
    泰坦陨落找不到msvcp120.dll怎么解决?分享四种解决方法
  • 原文地址:https://blog.csdn.net/qq_18237141/article/details/133385631