千家信息网

怎么有效地检查数组是否包含Java中的值

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍怎么有效地检查数组是否包含Java中的值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 检查数组是否包含值的四种不同方法1) 使用List:public s
千家信息网最后更新 2025年01月18日怎么有效地检查数组是否包含Java中的值

这篇文章主要介绍怎么有效地检查数组是否包含Java中的值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1. 检查数组是否包含值的四种不同方法

1) 使用List

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

2) 使用 Set:

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

3)使用一个简单的循环:

public static boolean useArraysBinarySearch(String[] arr, String targetValue) {              int a =  Arrays.binarySearch(arr, targetValue);        if(a > 0)          return true;       elsereturn false;}

4) 使用 Arrays.binarySearch()

public static boolean useArraysBinarySearch(String[] arr, String targetValue) {         int a =  Arrays.binarySearch(arr, targetValue);        if(a > 0)          return true;       elsereturn false;}

2. 时间复杂度

可以使用以下代码来测量大致的时间成本。基本思想是搜索大小为 5、1k、10k 的数组。该方法可能不精确,但其思想清晰而简单。

public static void main(String[] args) {        String[] arr = new String[] {  "CD",  "BC", "EF", "DE", "AB"};   //use listlong startTime = System.nanoTime();       for (int i = 0; i < 100000; i++) {                useList(arr, "A");        }       long endTime = System.nanoTime();        long duration = endTime - startTime;        System.out.println("useList:  " + duration / 1000000);   //use set        startTime = System.nanoTime();        for (int i = 0; i < 100000; i++) {                useSet(arr, "A");        }        endTime = System.nanoTime();        duration = endTime - startTime;        System.out.println("useSet:  " + duration / 1000000);   //use loop        startTime = System.nanoTime();        for (int i = 0; i < 100000; i++) {                useLoop(arr, "A");        }        endTime = System.nanoTime();        duration = endTime - startTime;        System.out.println("useLoop:  " + duration / 1000000);

结果:

useList:  13useSet:  72useLoop:  5

使用更大的数组 (1k):

String[] arr = new String[1000]; Random s = new Random();for(int i=0; i< 1000; i++){        arr[i] = String.valueOf(s.nextInt());}

结果:

useList:  112useSet:  2055useLoop:  99useArrayBinary:  12

使用更大的数组(10k):

String[] arr = new String[10000]; Random s = new Random();for(int i=0; i< 10000; i++){        arr[i] = String.valueOf(s.nextInt());}

结果:

useList:  1590useSet:  23819useLoop:  1526useArrayBinary:  12

显然,使用简单的循环方法比使用任何集合更有效。很多开发人员使用第一种方法,但效率低下。将数组推送到另一个集合需要在对集合类型执行任何操作之前遍历所有元素以读取它们。

如果使用 Arrays.binarySearch() 方法,则必须对数组进行排序。在这种情况下,数组未排序,因此不应使用它。

实际上,如果您需要有效地检查某个值是否包含在某个数组/集合中,排序列表或树可以在 O(log(n)) 中完成,或者 hashset 可以在 O(1) 中完成。

以上是"怎么有效地检查数组是否包含Java中的值"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0