for循环的缺点:
对于for循环遍历,我们很容易出现这样的一些低级错误:
对于数组
for(int i = 0 ; i >100 ; i++)
for(int i = 100 ; i >=0 ; i++)
我们有时候会写出像这样一时短路写出来的代码~原因很简单,i出现了三次,每个i我们都要小心!
但是for-each循环就不同了,全程都没有出现 i 好吧,何来错误?
对于集合
enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX }
Collection< Face > faces = Arrays.asList(Face.values());
for(Iterator< Face > i = faces.iterator(); i.hasNext();) {
for(Iterator< Face > j = faces.iterator(); j.hasNext();){
System.out.println(i.next() + " " + j.next());
}
}
看,i是外层循环,但是在内循环中不断i.next(),导致了错误。这也是疏忽导致的,我们需要在外层循环中记录下i.next()
像这样
enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX }
Collection<Face> faces = Arrays.asList(Face.values());
for(Iterator<Face> i = faces.iterator(); i.hasNext();){
Face face = i.next();
for(Iterator<Face> j = faces.iterator(); j.hasNext();) {
System.out.println(face + " " + j.next());
}
}
来看for-each循环:
for(Face face1 : faces)
for(Face face2 : faces)
System.out.println(face1 + " " + face2);
实在是太优雅了!!
但是在for-each循环有两个小缺点,相信大家在编程的时候也类词的情况:
- for-each得不到索引,这是个很尴尬的问题,导致所有需要索引的操作的行不通。比如书中提到的转换,平行迭代。
- for-each无法删除集合中的元素。原因很简单,迭代器是删除元素的御用神器啊啊啊
总结:能用for-each就用它,又容易写有整洁,除非要删除元素或者用到索引才用普通for。