JDK1.5開始新增了foreach循環,在語法上比for循環簡潔;
但foreach並不是for循環的語法糖,而可以說是iterator的語法糖;
普通for循環:
for(int i=0;i<100;i++) { a = i; }
foreach循環:
for(int i : integers) { a = i; }
實質上等同於:
for(Iterator<Integer> i=list.iterator();i.hasNext();) { a = i.next(); }
區別:
一個按順序遍歷,一個使用iterator迭代器遍歷;
從數據結構來說,畫重點:
for循環是隨機訪問元素,foreach是順序鏈表訪問元素;
性能上:
對於arraylist,是順序表,使用for循環可以順序訪問,速度較快;使用foreach會比for循環稍慢一些。
對於linkedlist,是單鏈表,使用for循環每次都要從第一個元素讀取next域來讀取,速度非常慢;使用foreach可以直接讀取當前結點,數據較快;
舉個栗子:
順序表 a[3]
用for循環,從a[0]開始直接讀到元素,接着直接讀a[1];(順序表的優點,隨機訪問)
用foreach, 得到a[0]-a[2]的全部地址放入隊列,按順序取出隊里里的地址來訪問元素;
單鏈表 b[3]
用for循環,從a[0]開始讀元素、然后通過a[0]的next讀到a[1]元素、通過a[0]的next的next讀到a[2]元素,以此類推,性能影響較大,慎用!
用foreach, 得到a[0]-a[2]的全部地址放入隊列,按順序取出隊里里的地址來訪問元素;