java效能優化方案3——不要使用iterator()方法

kele2014發表於2017-12-16

3、不要使用iterator()方法
這條建議不適用於一般的場合,僅適用於在 N.O.P.E 分支深處的場景。儘管如此也應該有所瞭解。Java 5格式的迴圈寫法非常的方便,以至於我們可以忘記內部的迴圈方法,比如:
for (String value : strings) {

// Do something useful here

}
當每次程式碼執行到這個迴圈時,如果 strings 變數是一個 Iterable 的話,程式碼將會自動建立一個Iterator 的例項。如果使用的是 ArrayList 的話,虛擬機器會自動在堆上為物件分配3個整數型別大小的記憶體。
private class Itr implements Iterator {

int cursor;
int lastRet = -1;
int expectedModCount = modCount;
// ...

也可以用下面等價的迴圈方式來替代上面的 for 迴圈,僅僅是在棧上“浪費”了區區一個整形,相當划算。
int size = strings.size();
for (int i = 0; i < size; i++) {

String value : strings.get(i);
// Do something useful here

}
如果迴圈中字串的值是不怎麼變化,也可用陣列來實現迴圈。
for (String value : stringArray) {

// Do something useful here

}
小結
無論是從易讀寫的角度來說,還是從API設計的角度來說迭代器、Iterable介面和 foreach 迴圈都是非常好用的。但代價是,使用它們時是會額外在堆上為每個迴圈子建立一個物件。如果迴圈要執行很多很多遍,請注意避免生成無意義的例項,最好用基本的指標迴圈方式來代替上述迭代器、Iterable介面和 foreach 迴圈。


相關文章