for(Element e : elements) {
doSomething(e);
}
当见到冒号(:)时,可以把他读作“在...里面”。因此上面的循环可以读作“对于元素中的每个元素e”。注意,利用for-each循环不会有性能损失,甚至用于数组也一样。实际上,在某些情况下,比起普通的for循环,他还稍有些性能优势,因为他对数组索引的边界值只计算一次。虽然可以手工完成这项工作,但程序员并不总会这么做。
在对多个集合进行嵌套式迭代时,for-each循环相对于传统for循环的这种优势还会更加明显。
for-each循环不仅让你遍历集合和数组,还让你遍历任何实现Iterable接口的对象。
实现Iterable接口并不难。如果你在编写的类型表示的是一组元素,即使你选择不让他实现Collection,也要让他实现Iterable。这样可以允许用户利用for-each循环遍历你的类型,会令用户永远感激不尽的。
总之,for-each循环在简洁性和预防Bug方面有着传统的for循环无法比拟的优势,并且没有性能损失。应该尽可能的使用for-each循环。遗憾的是,有三种常见的情况无法使用for-each循环:
- 过滤——如果需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用他的remove方法。
- 转换——如果需要遍历列表或者数组,并取代他部分或者全部的元素值,就需要列表迭代器或者数组索引,以便设定元素的值。
- 平行迭代——如果需要并行的遍历多个集合,就需要显式的控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以得到同步前移。
在以上任何一种情况下,就要使用普通的for循环,要警惕提到的陷阱,并且要确保做到最好。