要遍歷元素,可以使用迭代器 (iterator) 或是陣列索引來訪問,一旦發生錯誤,編譯器不一定能發現錯誤。
// iterator
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
doSomething(i.next());
}
// array
for (int i = 0; i < a.length; i++) { doSomething(a[i]); }
使用 for-each 可以減少上述問題,效能上也不會受到影響。for (Element e : elements) { doSomething(e); }
下列的程式將列出所有骰子可能出現的點數組合,但這段程式是有 BUG 的,它並不會印出 36 種組合,只會印出 6 種組合。
enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX }
Collection<Face> faces = EnumSet.allOf(Face.class);
for (Iterator<Face> i = faces.iterator(); i.hasNext(); )
for (Iterator<Face> j = faces.iterator(); j.hasNext(); )
System.out.println(i.next() + " " + j.next());
正確的程式應該修改為 i.next() 需要先被保留起來,而不是每次 println 時就執行一次 next()。
for (Iterator<Face> i = faces.iterator(); i.hasNext(); ) {
Face f = i.next();
for (Iterator<Face> j = faces.iterator(); j.hasNext(); ) {
System.out.println(f + " " + j.next());
}
}
若是改用 for-each,就可以避免上述的錯誤。
for (Face f1 : faces)
for (Face f2 : faces)
System.out.println(f1 + " " + f2);
但仍是有幾種狀況是無法使用 for-each 的:- 刪除或是過濾元素 - 要移除某些特定條件的元素
- 轉換 - 將元素作取代的動作
- 平行迭代
沒有留言:
張貼留言