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循環效率最高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM