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());   //得到同步前移

转载于:https://my.oschina.net/OutOfMemory/blog/95483

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值