您的位置:首页 > Web前端

Effective Java之for-each循环优先于for循环(四十六)

2018-01-07 19:57 429 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  for-each