這篇文章展示了如何解決ArrayList的java.util.ConcurrentModificationExcepiton。
錯誤信息展示如下:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
問題
你可能需要遍歷ArrayList息尺,并在某些條件下刪除一些元素疾掰,舉個例子,一下代碼看起來很合理:
import java.util.ArrayList;
import java.util.List;
public class AddRemoveListElement {
public static void main(String args[]) {
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
for (String s : list) {
if (s.equals("B")) {
list.remove(s);
}
}
}
}
輸出:
異常消息
解決方法1
Iterator 可以用來解決這個問題并级。迭代器準許調(diào)用者從底層集合中刪除元素侮腹。
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String str = iter.next();
if( str.equals("B") )
{
iter.remove();
}
}
解決方法二
CopyOnWriteArrayList可以用來解決問題。CopyOnWriteArrayList是ArrayList的線程安全變體呀潭,其中所有變動(添加至非,設(shè)置等)都是通過對底層數(shù)組制作一個新的副本來實現(xiàn)的。
public static void main(String args[]) {
List<String> list = new CopyOnWriteArrayList<String>();
list.add("A");
list.add("B");
for (String s : list) {
if (s.equals("B")) {
list.remove(s);
}
}
}
其他Collection 類型如何谐鼎?
public static void main(String args[]) {
Set<String> set = new HashSet<String>();
set.add("A");
set.add("B");
for (String s : set) {
if (s.equals("B")) {
set.remove(s);
}
}
}
上面的代碼是沒問題的趣惠,因為他們沒用在底層使用數(shù)組作為底層的數(shù)據(jù)結(jié)構(gòu)。