集合遍歷 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()); //獲得同步前移