ArrayList 遍歷方式及性能對比

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()判斷是否還有更多元素。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章