php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常
3種方式解決iterator迭代器并發修改異常ConcurrentModificationException
在使用迭代器的時候,時長會遇到 ConcurrentModificationException(并發修改異常)
這也是很多人頭疼的問題
并發修改異常產生的原因
在使用迭代器迭代集合的同時,使用原集合修改元素;如果迭代器發現自己和集合不一樣,就會拋出 ConcurrentModificationException 異常。
先拿出我寫的小案例:
Collection list = new ArrayList<>();
list.add("JAVA");
list.add("Python");
list.add("PHP");
Iterator it = list.iterator();
while(it.hasNext()) {
if (it.next().equals("PHP")) {
list.add("我全都要");
}
}
一運行,就拋異常
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at Test.main(Test.java:13)
看看源碼:
at java.util.ArrayList$Itr.next(ArrayList.java:859)
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
modCount 為 ArrayList 的類成員變量,用來記錄其變化次數;而 expectedModCount 作為迭代器成員變量,則存儲了 iterator 初始化時記錄到的 ArrayList 中的 modCount 值。如果 modConut 和 expectedModCount 不相等,則拋出 ConcurrentModificationException 異常。
解決方法
這里我使用3種解決方案
使用列表迭代器
不使用迭代器遍歷,使用普通for遍歷
使用toArray
第一種:使用列表迭代器
List list = new ArrayList<>();
list.add("JAVA");
list.add("Python");
list.add("PHP");
ListIterator it = list.listIterator();
while(it.hasNext()){
if (it.next().equals("PHP")) {
// list.add("以上幾個"); //這里注意:直接修改原集合會拋出并發修改異常
it.add("我全都要");
}
}
System.out.println(list);
輸出結果
[JAVA, Python, PHP, 我全都要]
第二種:不使用迭代器遍歷,使用普通for遍歷
ArrayList list = new ArrayList<>();
list.add("JAVA");
list.add("Python");
list.add("PHP");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("PHP")) {
list.remove("我全都要");
list.add("C++");
}
}
System.out.println(list);
輸出結果
[JAVA, Python, PHP, C++]
第三種:使用toArray
ArrayList list = new ArrayList<>();
list.add("JAVA");
list.add("Python");
list.add("PHP");
Object[] obj = list.toArray();
for (int i = 0; i < obj.length; i++) {
if (obj[i].equals("PHP")) {
list.add(0,"今晚學習");
}
}
System.out.println(list);
輸出結果
[今晚學習, JAVA, Python, PHP]
通過以上3種方法都可以解決 iterator 導致的并發修改異常。
如果非要使用迭代器修改集合,可以使用列表迭代器 ListIterator
總結
以上是生活随笔為你收集整理的php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智慧引擎怎么关闭
- 下一篇: ps怎么换照片背景(PS怎么把照片背景换