• Java Set的五种遍历方式


      摘要:介绍Java遍历Set的五种方式,并分析哪中方式效率高,建议使用增强for循环变量。

      Set 和 List 遍历方式基本一致,本文介绍Set的遍历方式,并比较那种方法执行效率最高。

    1、迭代器方法

    /**
       /**
         * 1 iterator
         * 迭代器
         *
         * @param set
         */
        public static void iteratorTest(Set<Integer> set) {
            System.out.println("1 iterator 遍历方法");
    
            long start = System.currentTimeMillis();
            set.forEach(item -> {
                // System.out.println(item);
            });
            System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
    
            StringBuilder sb = new StringBuilder(set.size());
            for (Iterator<Integer> iterator = set.iterator(); iterator.hasNext(); ) {
                sb = sb.append(iterator.next()).append(",");
            }
            System.out.println(sb.length());
    
            /**
             * while 循环写法
             */
            Iterator<Integer> iterator = set.iterator();
            while (iterator.hasNext()) {
                iterator.next();
            }
    
        }
    

      该方法用到了Iterator迭代器,略显繁琐,请考虑使用增强for遍历的方法。

    2、增强for遍历

        /**
         * 2 增强for循环
         *
         * @param set
         */
        public static void forTest(Set<Integer> set) {
            System.out.println("2 增强for循环");
            long start = System.currentTimeMillis();
    
    //        StringBuilder sb = new StringBuilder(set.size());
            for (int item : set) {
    //            sb = sb.append(item).append(",");
            }
    //        System.out.println(sb);
            System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
        }
    

      温馨提示:在对set集合成进行遍历的时候,请勿同时执行修改操作,比如删除,这样会导致程序崩溃。

    forEach方法

      set.forEach 自java 8 才支持。forEach 效率最低,不推荐!

        /**
         * 3 forEach 遍历方式
         * forEach 最慢不推荐 java8 lambda
         * 注意:在对set集合成进行遍历的时候不能同时进行修改操作,比如删除,这样会导致崩溃。
         *
         * @param set
         */
        public static void forEachTest(Set<Integer> set) {
            System.out.println("3 forEach 遍历方式");
            long start = System.currentTimeMillis();
            set.forEach(item -> {
    //            System.out.println(item);
            });
            System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
    
        }
    

    stream.forEach方法

      set.stream().forEach也是在java 8 才支持。

        /**
         * 4 stream forEach
         * stream foreach java8 特有
         *
         * @param set
         */
        public static void streamForEachTest(Set<Integer> set) {
            System.out.println("4 stream forEach");
            long start = System.currentTimeMillis();
            set.stream().forEach(item -> {
                // System.out.println(item);
            });
            System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
    
        }
    

      耗时和增强for差不多。

    5 forEachRemaining方法

      此方法也是在java 8 才支持,主要用于继续输出集合中剩余的元素。这里用于遍历全部元素:

       /**
         * 5 forEachRemaining
         *
         * @param set
         */
        public static void forRemainingTest(Set<Integer> set) {
            System.out.println("5 forEachRemaining");
            int i = 0;
            long start = System.currentTimeMillis();
            Iterator<Integer> iterator = set.iterator();
    //        set.iterator().forEachRemaining(value -> System.out.print(value + " "));
            iterator.forEachRemaining(
                new Consumer<Integer>() {
                    @Override
                    public void accept(Integer value) {
    //                        System.out.println(value);
                    }
                }
    
            );
            System.out.println("耗时 time=\t" + (System.currentTimeMillis() - start));
        }
    

    案例分析

      使用如下main函数,调用如上几种方法,以分析各个方法执行效率:

        public static void main(String[] args) {
            int n = 1000000;
            Set<Integer> set = new HashSet<>(n);
            for (int i = 0; i < n; i++) {
                set.add(i);
            }
    
            iteratorTest(set);
            forTest(set);
            forEachTest(set);
            streamForEachTest(set);
    
            forRemainingTest(set);
        }
    

      执行结果如下:

    1 iterator 遍历方法
    耗时 time=	130
    6888890
    2 增强for循环
    耗时 time=	9
    3 forEach 遍历方式
    耗时 time=	15
    4 stream forEach
    耗时 time=	12
    5 forEachRemaining
    耗时 time=	16
    
    Process finished with exit code 0
    

      由执行结果可知,增强for循环效率最高。

  • 相关阅读:
    如何在sharepoint2010中配置Google Anlytics 分析服务
    如何为基于windows验证的站点的某个页面、文件或文件夹单独设置匿名访问
    URL 路径长度限制(错误:指定的文件或文件夹名称太长)
    规划在sharepoint中使用安全组
    sql server 2014预览版发布
    如何排查sharepoint2010用户配置文件同步服务启动问题
    PHP变量问题,Bugku变量1
    BugkuWeb本地包含
    本地域名解析知识hosts
    BugkuWEB矛盾
  • 原文地址:https://www.cnblogs.com/east7/p/16115176.html
Copyright © 2020-2023  润新知