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