zoukankan      html  css  js  c++  java
  • java中如何高效判断数组中是否包含某个特定的值

    四种不同方式检查数组是否包含某个值

    使用List:

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

    使用Set:

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

    使用简单的循环语句:

    public static boolean useLoop(String[] arr, String targetValue) {
            for (String s : arr) {
                if (s.equals(targetValue))
                    return true;
            }
            return false;
        }

    使用Arrays.binarySearch()方法:

    下面的代码是错误的,之所以列在下面是出于完整性考虑(四种判断方式),binarySearch()二分查找只能用于有序数组。

    运行下面程序,你有可能会得到异常结果;

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

    四种实现方式对应的时间开销

    数组大小为5:

    public static void main(String[] args) {
            String[] arr = new String[] { "CD", "BC", "EF", "DE", "AB" };
            // use list
            long 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);
            // use Arrays.binarySearch()
            startTime = System.nanoTime();
            for (int i = 0; i < 100000; i++) {
                useArraysBinarySearch(arr, "A");
            }
            endTime = System.nanoTime();
            duration = endTime - startTime;
            System.out.println("useArrayBinary: " + duration / 1000000);
        }

    运行结果:

    useList: 13
    useSet: 72
    useLoop: 5
    useArraysBinarySearch: 9

    数组大小为1000:

    String[] arr = new String[1000];
            Random s = new Random();
            for (int i = 0; i < 1000; i++) {
                arr[i] = String.valueOf(s.nextInt());
            }
    
    运行结果:
    useList: 112 useSet: 2055 useLoop: 99 useArrayBinary: 12

    结论:

    从测试结果可以看出,使用简单的循环语句比使用任何集合都高效,很大一部分开发人员选择使用第一种方法(List),但这种方法其实是相对低效的。在使用集合提供的API前,需要把一个数组放到集合里,这需要消耗一定的时间,特别是对于Set集合;(注:其实ArrayList集合的性能跟普通的循环语句差不多,因为对于ArrayList,转换成集合的时候,仅仅是改变了内部的数组索引,遍历判断的时候,跟普通的循环语句类似);

    如果要使用Arrays.binarySearch()方法,前提是数组要有序,在这个测试demo中,很显然数组是无序的,因此不该被使用;

    事实上,如果你确实需要高效的去检查数组或集合中是否包含某个值,一个有序列表或者有序树能把时间复杂度降低到O(log(n)),或者使用散列集合,时间复杂度为O(1);

    译文链接:http://www.programcreek.com/2014/04/check-if-array-contains-a-value-java/

    连接风一样的码农:http://www.cnblogs.com/chenpi/category/783125.html

    引用原文:http://blog.csdn.net/sinat_33536912/article/details/52093989

    写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!

    如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

  • 相关阅读:
    关于maven下载速度慢,下载完的依赖包不知去向的应对措施
    进一步解析二分搜索树的实现
    mysql语法建库建表综合整理是示例
    走进二分搜索树的第一课
    优先队列和堆
    window系统mysql安装后获取默认密码
    微信小程序中使用云开发获取openid
    使用IDEA将springboot框架导入的两种方法
    C/C++、Qt4实现FTP客户端(有无界面版)
    云服务器搭建代理服务器 —— 某sock ,简单说明
  • 原文地址:https://www.cnblogs.com/summary-2017/p/7975890.html
Copyright © 2011-2022 走看看