一、遍歷集合List的五種方法
測試數據
List<String> list = new ArrayList<>();
list.add("A");list.add("B");list.add("C");
1. 普通for循環
普通for循環,通過索引遍歷
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}
2. 增強for循環
增強for循環,數組以及所有Collection集合都可以使用增強for循環遍歷。遍歷集合的實際原理為獲取集合的iterator迭代器對象進行迭代遍歷。
for (String s : list) {System.out.println(s);
}
3. Iterator迭代器遍歷
Collection接口繼承自Iterable接口,所有Collection集合都必須實現iterator()方法返回一個Iterator迭代器對象。因此可以通過list的iterator()方法獲取迭代器對象來進行遍歷。并且可在迭代過程中調用iterator.remove()安全移除當前元素。
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String s = iterator.next();if (s.equals("B")) iterator.remove();System.out.println(s);
}
4. ListIterator迭代器遍歷
所有List集合都必須實現一個listIterator()方法,返回一個ListIterator迭代器對象。ListIterator 是 Iterator 的子接口,除了可以從前往后遍歷外,還可以反向遍歷,即從后往前遍歷。還可以在遍歷過程中使用listIterator.add()方法在當前遍歷位置之后插入元素,使用listIterator.set() 方法修改當前元素,以及使用listIterator.remove()移除當前元素。
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {String element = listIterator.next();if (element.equals("B")) {// 修改當前元素listIterator.set("D");// 在當前元素后面插入一個新元素listIterator.add("E");//將迭代器指針移動到前一個元素,然后進行刪除listIterator.previous();listIterator.remove();}
}
System.out.println(list); // 輸出 [A, D, C]
5. list.forEach(lambda表達式)
list.forEach(element -> {// 使用 elementSystem.out.println(element);
});
二、如何在遍歷集合過程中安全移除元素
如果在使用 Iterator 或 ListIterator 遍歷集合的過程中,使用了list.remove() 方法來移除元素,而沒有通過迭代器自身的 remove() 方法,就有可能導致 ConcurrentModificationException。這是因為list內部維護了一個修改計數器modCount, 記錄list中添加和刪除元素的次數,迭代器對象內部會維護一個迭代器修改計數器expectedModCount,如果被非迭代器方法修改了list,導致modCount增加了而expectedModCount沒有增加,導致二者不想等于是在check時拋出異常。
- 因此在增強for循環中不能添加或移除元素。
- 需要使用Iterator 或 ListIterator 來迭代遍歷集合,并且使用迭代器的方法來移除或添加元素。