迭代list,map
2017-08-04 11:29
127 查看
原文:http://blog.csdn.net/lipei1220/article/details/9028669
java.util.ConcurrentModificationException 解决办法:
在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。
则使用会报以下异常:
Java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
例如以下程序(转自互联网):
[java] view
plain copy
mport 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.*;
java.util.ConcurrentModificationException 解决办法:
在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。
则使用会报以下异常:
Java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
例如以下程序(转自互联网):
[java] view
plain copy
mport 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.*;
相关文章推荐
- Java基础:循环迭代Array/List/Set/Map集合 增强for循环
- javaweb之自定义标签库——迭代标签(foreach)(可迭代Map、List、Set、任意数组)
- java 集合 list 接口 集合的迭代 超级for循环 扩容 链表 map Hash
- freemarker迭代list、map等常规操作
- 迭代输出Map和List<Map<String,Object>>的方法
- webwork里面List迭代数据字典Map中数据!
- 笔记 freemark list标签迭代Map<Map<String,Object>集合排序问题
- Play FrameWork框架中scala.html页面迭代Map和List
- 迭代输出Map和List<Map<String,Object>>的方法
- 【js jQuery】map集合 循环迭代取值---以及 map、json对象、list、array循环迭代的方法和区别
- JAVA8学习(一)List、Map的循环迭代
- Map集合,List集合,Array数组,Iterator迭代,Collection集合,Set集合的多种遍历方式
- JAVA中util类里的map/set/list/vector之间的关系
- c++ list, vector, map, set 区别与用法比较
- list,set,map,数组间的相互转换
- paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
- list集合里面泛型是map如何取出值
- Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法
- Collection集合之六大接口(Collection、Set、List、Map、Iterator
- Java重要的数据结构Set,List,Map