摘要:介绍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循环效率最高。