for-each循环优先于传统的for循环

集合遍历

jdk1.5之前对集合和数组的遍历
for(Iterator i=c.iterator();i.hasNext();){
  dosomething((Element)i.next());
}

for(int i=0;i<a.length;i++){
}

jdk1.5以后
for(Element e:elements){}
1.利用for-each不会有性能的损失,在某些情况下,比起普通的for循环,它还稍有性能优势,因为它对数组索引的边界值只计算一次。

2.在对多个集合进行嵌套迭代时,for-each循环相对应传统的for循环的这种优势会更加明显

enum Face{one,two,three,four,five,six}

Collection<Face> faces=new 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());

程序不会抛出异常,但不会完成你的工作,这种bug很难发现
如果使用for-each这个问题就完全消失了
for(Face f1:faces)
  for(Face f2:faces)
  system.out.println(f1+""+f2);

有几种情况无法使用for-each

1.替换:需要替换列表中的部分元素或全部元素

List<String> test=new ArrayList<String>();
test.add("aa");
test.add("bb");
for(String s:test){
test.remove(s);
test.add("New_aa");//ConcurrentModificationException
}
for(int i=0;i<test.size();i++){
test.remove(i);
test.add("new");
}
//成功的替换

2.删除:如果要遍历,并删除指定的元素(并不是当前遍历到的元素),就需要显示的迭代器

3.迭代如果需要并行的遍历多个集合,就需要显示的控制迭代器或者索引变量,以便所有迭代器或者索引变量得到同步前移

如这段上面举例的问题代码
enum Face{one,two,three,four,five,six}

Collection<Face> faces=new 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());   //得到同步前移

你可能感兴趣的:(for-each循环优先于传统的for循环)