Java Set的五种遍历方式

2025-05-07 21:17:23

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

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

1、迭代器方法

/**

/**

* 1 iterator

* 迭代器

*

* @param set

*/

public static void iteratorTest(Set 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 iterator = set.iterator(); iterator.hasNext(); ) {

sb = sb.append(iterator.next()).append(",");

}

System.out.println(sb.length());

/**

* while 循环写法

*/

Iterator iterator = set.iterator();

while (iterator.hasNext()) {

iterator.next();

}

}

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

2、增强for遍历

/**

* 2 增强for循环

*

* @param set

*/

public static void forTest(Set 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 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 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 set) {

System.out.println("5 forEachRemaining");

int i = 0;

long start = System.currentTimeMillis();

Iterator iterator = set.iterator();

// set.iterator().forEachRemaining(value -> System.out.print(value + " "));

iterator.forEachRemaining(

new Consumer() {

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

    男士钱包什么牌子好?10大男士钱包品牌排行榜
    泉泽的解释

    Copyright © 2022 摩洛哥世界杯_直播世界杯决赛 - dgaida.com All Rights Reserved.