深入分析foreach和迭代器:
1.foreach可以操作數(shù)組(底層依然采用for循環(huán)+索引來獲取數(shù)組元素)
2.foreach可以操作Iterable實例(底層其實采用的Iterator(迭代器))
++一般情況下,直接使用foreach迭代數(shù)組和集合元素既可,簡單,但是當(dāng)邊迭代邊刪除元素的時候,不能使用foreach,只能使用迭代器++
錯誤示范代碼:
public static void main(String[] args) {
List list = new ArrayList();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
for (Object ele : list) {
System.out.println(ele);
//刪除集合中為B字符串的元素
if ("B".equals(ele)) {
list.remove(ele);
}
}
}
/*
運行完成之后報錯:java.util.ConcurrentModificationException(并發(fā)修改異常)
*/
當(dāng)使用迭代器的時候,在當(dāng)前線程A中,會單獨創(chuàng)建一個新的線程B.A線程負(fù)責(zé)繼續(xù)迭代,B線程負(fù)責(zé)去刪除.
B線程每次都會去檢查和A線程中的元素個數(shù)是否相同,如果不相同則報錯
java.util.ConcurrentModificationException
- 不要使用集合對象的刪除方法
在Collection接口中存在刪除指定元素的方法
boolean remove(Object ele);
該方法只能從集合中刪除因素,不能 把迭代器中指定的元素也刪除.
解決辦法
在迭代集合的時候,邊迭代邊刪除是非常 常用的操作,如何解決并發(fā)修改異常?
使用Iterator中的remove方法
該方法會從兩個線程中同時移除被刪除的元素,保證了兩個線程的同步.
public static void main(String[] args) {
List list = new ArrayList();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
Iterator it = list.iterator();
while(it.hasNext()){
Object ele = it.next();
if ("B".equals(ele)) {
//list.remove(ele);//錯誤,不能使用
it.remove();
}
}
System.out.println(list);
}