java.util.ConcurrentModificationException 解决办法(使用迭代器时出现异常)

来源:互联网 发布:淘宝卖家ipad客户端 编辑:程序博客网 时间:2024/05/16 15:51

在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。

则使用会报以下异常:
Java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
        at java.util.HashMap$KeyIterator.next(HashMap.java:828)

解决办法(单线程):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 1 使用Iterator提供的remove方法,用于删除当前元素
 for(Iterator<string> it = myList.iterator(); it.hasNext();) {
     String value = it.next();
      if(value.equals( "3")) {
          it.remove(); // ok
     }
}
System. out.println( "List Value:" + myList.toString());
 
 // 2 建一个集合,记录需要删除的元素,之后统一删除            
List<string> templist = newArrayList<string>();
 for(String value : myList) {
      if(value.equals( "3")) {
          templist.remove(value);
     }
}
 // 可以查看removeAll源码,其中使用Iterator进行遍历
myList.removeAll(templist);
System. out.println( "List Value:" + myList.toString());       
 
  // 3. 使用线程安全CopyOnWriteArrayList进行删除操作
List<string> myList = newCopyOnWriteArrayList<string>();
myList.add("1");
myList.add("2");
myList.add("3");
myList.add("4");
myList.add("5");
 
Iterator<string> it = myList.iterator();
 
 while(it.hasNext()) {
     String value = it.next();
      if(value.equals( "3")) {
          myList.remove("4");
          myList.add("6");
          myList.add("7");
     }
}
System. out.println( "List Value:" + myList.toString());
 
 // 4. 不使用Iterator进行遍历,需要注意的是自己保证索引正常
 for( inti = 0; i < myList.size(); i++) {
     String value = myList.get(i);
     System. out.println( "List Value:" + value);
      if(value.equals( "3")) {
          myList.remove(value); // ok
          i--;// 因为位置发生改变,所以必须修改i的位置
     }
}
System. out.println( "List Value:" + myList.toString());</string></string></string></string></string></string>

0 0