for-each循環優先於傳統的for循環

集合遍歷 java

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.替換:須要替換列表中的部分元素或所有元素 spa

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.刪除:若是要遍歷,並刪除指定的元素(並非當前遍歷到的元素),就須要顯示的迭代器 code

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());   //獲得同步前移
相關文章
相關標籤/搜索