增強for循環是什么?
增強for循環亦為高級for循環。
增強for循環內部是使用的iterator來遍歷的,只能遍歷數組和實現了Iterable接口的集合。優點是寫法簡便,無需獲得數組、集合長度,也無需根據索引來訪問元素。缺點是不能在循環里動態的刪除元素和獲取元素下標。
任何的增強for循環都可以改寫為普通for循環。遍歷集合所有元素的話用增強for循環更加簡潔,如果是復雜的循環,還是用for循環比較好,for循環功支持索引取元素,可以使用下標來控制位置。
高級for有一個局限性,必須有被遍歷的目標。建議在遍歷數組的時候,還是希望使用傳統for,因為傳統for可以定義角標。凡是支持迭代器的都支持高級for
.而對于 LinkedList 由于獲取一個元素,要從頭開始向后找,因此建議使用 增強for循環,也就是iterator。
下面用一個例子說明這點:
代碼一
public static void removeEvensVer2(List<Integer> lst)
{
for (Integer x : lst)
if (x % 2 == 0)
lst.remove(x);
System.out.println(lst);
}
public static void removeEvensVer2(List<Integer> lst) { for (Integer x : lst) if (x % 2 == 0) lst.remove(x); System.out.println(lst); }代碼二
public static void removeEvensVer3(List<Integer> lst)
{
Iterator<Integer> itr = lst.iterator();
while (itr.hasNext())
if (itr.next() % 2 == 0)
itr.remove();
System.out.println(lst);
}
public static void removeEvensVer3(List<Integer> lst) { Iterator<Integer> itr = lst.iterator(); while (itr.hasNext()) if (itr.next() % 2 == 0) itr.remove(); System.out.println(lst); }代碼一在運行時拋出異常,代碼二正常原因分析:因為增強的for循環內部就是調用iterator實現的,在遍歷的時候就將list轉化為了迭代器,當迭代器被創建之后,如果從結構上對列表修改除非通過迭代器自身的remove、add方法,其他任何時間任何方式的修改,迭代器都會拋出ConcurrentModificationException異常。