Iterator遍历异常

java.util.ConcurrentModificationException
    at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:373)
    at java.util.LinkedHashMap$KeyIterator.next(LinkedHashMap.java:384)
    at com.egosystems.apputil.pool.ConnectionFactory.schedule(ConnectionFactory.java:419)
    at com.egosystems.apputil.pool.FactoryMangeThread.run(FactoryMangeThread.java:56)
    at java.lang.Thread.run(Thread.java:619)

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

import java.util.*;

public class Main
{
public static void main(String args[])
{
Main main = new Main();
main.test();
}

public void test()
{
Map bb = new HashMap();
bb.put("1", "wj");
bb.put("2", "ry");
Iterator it = bb.keySet().iterator();
while(it.hasNext()) {
Object ele = it.next();
            bb.remove(ele);    //wrong
}
System.out.println("Success!");
}
}

Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterator(Object ele=it.next())会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。

 解决办法

1) 通过Iterator修改Hashtable
while(it.hasNext()) {
Object ele = it.next();
            it.remove();
}

 

2) 根据实际程序,您自己手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。

 

3) 使用“ConcurrentHashMap”替换HashMap,ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。
import java.util.concurrent.*;

 

4)推荐

这个问题是说,你不能在对一个List进行遍历的时候将其中的元素删除掉
解决办法是,你可以先将要删除的元素用另一个list装起来,等遍历结束再remove
可以这样写:

List delList = new ArrayList();//用来装需要删除的元素
for(Information ia:list)
{
    if(ia.getId()==k){
        delList.add(ia);
     }
}
list.removeAll(delList);//遍历完成后执行删除

 

posted @ 2017-07-28 14:40  小闲石  阅读(213)  评论(0编辑  收藏  举报