今天在删除Map中的key值得时候,使用了Iterator,在迭代的时候删除某个key值,发现报了一个异常:
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.HashMapHashIterator.nextEntry(HashMap.java:922)atjava.util.HashMapKeyIterator.next(HashMap.java:956)
问题分析:原来是在使用迭代器的时候改变KeySet(如插入或者删除元素)会改变List、Set、Map的size,遍历的时候会检查size值,这个时候在访问迭代器就会报这个异常。
解决办法:
1、如果是删除List、Set、Map的某些元素,可以先建一个list容器,在遍历Iterator的时候,先把需要删除的元素存起来,然后再使用removeAll(Collection)统一删除;
测试代码:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
map.put("5", "5");
Set<String> keySet = map.keySet();
Iterator<String> itr = keySet.iterator();
Set<String> removeSet = new HashSet<>();
while (itr.hasNext()) {
String key = itr.next();
if (key.equals("1") || key.equals("2")) {
removeSet.add(key);
}
}
keySet.removeAll(removeSet);
for(String s : keySet){
System.out.print(s+" ");
}
}
2、删除某些元素还可以直接使用Iterator.remove()方法;
测试代码:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
map.put("5", "5");
Set<String> keySet = map.keySet();
Iterator<String> itr = keySet.iterator();
while (itr.hasNext()) {
String key = itr.next();
if (key.equals("1") || key.equals("2")) {
itr.remove();
}
}
for(String s : keySet){
System.out.print(s+" ");
}
}
3、使用Map可以使用ConcurrentHashMap来避免这种问题的发生;
4、在对List、Set、Map有修改删除操作的时候,遍历数据的时候避免使用迭代器Iterator。