List的幾種遍歷方式
int num = 1000000;
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
list.add(i);
}
(1) for each循環
// for each
for (Integer v : list) {
}
或
// JDK8開始支持
list.forEach(item -> {
item.intValue();
});
// 多線程並行操作
list.stream().forEach(item -> {
item.intValue();
});
(2) 迭代器
for (Iterator<Integer> iterator = list.iterator(); iterator.hasNext();) {
iterator.next();
}
或
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.next();
// if (iterator.next() % 10 == 0)
// iterator.remove();
}
(3) 下標索引 調用size()函數比較判斷
for (int i = 0; i < list.size(); i++) {
list.get(i);
}
或
int size = list.size();
for (int i = 0; i < size; i++) {
list.get(i);
}
測試環境 :
Java 8,Eclipse -Xms512m -Xmx512m
最終測試結果:
性能測試結果分析:
1、在ArrayList大小爲十萬之前,幾種遍歷方式時間消耗差距不是很大,百萬性能相差也不過50ms左右;
2、Iterator方式可以在遍歷時修改內部的元素(如:刪除元素);
3、綜合性能 get方式 > Iterator方式 > foreach() ;
4、考慮foreach的優點:代碼簡潔,不必關心下標初始值和終止值及越界等,可選用foreach方式進行遍歷。
擴展:
foreach是Java SE5.0引入的功能很強的循環結構,for (Integer j : list)應讀作for each int in list。
使用foreach結構的類對象必須實現了Iterable接口,foreach實現幾乎等價於 Iterator,foreach的等價實現中可以看到,會調用這個函數得到Iterator,再通過Iterator的next()得到下一個元素,hasNext()判斷是否還有更多元素。