首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合遍歷效能實測:Iterator > for-each > 傳統 for

     編輯:Java 綜合教學

Java 集合遍歷效能實測:Iterator > for-each > 傳統 for

測試結論先行

對 List<Map> 進行 10 萬次元素訪問測試,四種寫法耗時排序(納秒級):

  1. Iterator 顯式迭代:最快
  2. for-each (增強 for):次之
  3. 預存 size 的傳統 for:再次之
  4. 每次調用 list.size() 的傳統 for:最慢

測試代碼核心片段

List<Map<String,Object>> list = ... // 10萬相同元素

// 1. 每次調用 size()
for (int i=0; i<list.size(); i++) { ... }

// 2. for-each
for (Map m : list) { ... }

// 3. Iterator
for (Iterator it = list.iterator(); it.hasNext(); ) { ... }

// 4. 預存 size
int size = list.size();
for (int i=0; i<size; i++) { ... }

效能差異深度解析

寫法字節碼特點優缺點
Iterator直接調用 hasNext/next,無索引運算最通用、無邊界檢查開銷、支持 remove() 安全刪除
for-each編譯器插入 Iterator,語法糖可讀性最好,但無法獲取索引、無法安全刪除
預存 size for索引訪問 get(i),避免重複調用 size()隨機訪問集合(ArrayList)極快;鏈表(LinkedList)因 get(i) 遍歷而極慢
未預存 size for每次循環調用 size() 方法額外方法調用開銷,ArrayList size() 是 O(1) 但仍有調用成本

實戰建議

  • 首選 for-each:代碼簡潔、語義清晰、效能足夠 99% 場景。
  • 需索引或刪除元素:使用顯式 Iterator。
  • 高頻熱點路徑 + ArrayList:預存 size 的傳統 for 可微優化。
  • LinkedList 絕禁索引遍歷:get(i) 為 O(n),整體變 O(n²);必須用 Iterator/for-each。

避坑指南

微基準測試(JMH)才可得精準結論;單次 System.nanoTime() 受 JIT 預熱、GC、OS 調度干擾大。但相對優先級結論穩健:Iterator ≥ for-each > 預存 size for > 未預存 size for。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved