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循环效率最高。
.wechat { width: 180px; height: 180px; }
.zsdiv { display: flex }
.aTip { font-size: 18px; font-family:”楷体”,”楷体_GB2312″; }
.tipRight { padding: 1px 0px 0px 0px }
.tipwechat {
width: 32px;
height: 32px;
border: medium none;
box-shadow: none;
margin-left: 5px;
vertical-align: middle;
}