對 List<Map> 進行 10 萬次元素訪問測試,四種寫法耗時排序(納秒級):
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) 但仍有調用成本 |
Iterator。size 的傳統 for 可微優化。get(i) 為 O(n),整體變 O(n²);必須用 Iterator/for-each。微基準測試(JMH)才可得精準結論;單次 System.nanoTime() 受 JIT 預熱、GC、OS 調度干擾大。但相對優先級結論穩健:Iterator ≥ for-each > 預存 size for > 未預存 size for。