概述
场景1:
对Map进行遍历的同时对其进行了新增操作.
原因:
非线性的数据结构在遍历过程中添加元素的需求不合理,所以 set 和 map 的迭代器没有 add 方法。
listIterator中的add方法是向next()方法对应的元素之前添加元素,也就是说,后续不会遍历到这些元素。这一点成立的前提是List的所有实现类都是有序的。而Set和Map大部分的实现类都是不保证有序的。
也就是说,不能保证新插入的元素在后续会被遍历或者不会被遍历到。如果边遍历边插入,容易引起死循环等问题。因此,Set和Map的迭代器实现类不具备提供add方法的条件。
解决方案:
引入一个临时的容器,将需要添加的元素先添加到临时容器中,等待遍历结束后再将临时容器中的元素addAll到Set或putAll到Map中。
场景2
对Map进行删除操作
原因
首先HashMap里面有个成员属性modCount,用于记录map被修改的次数(当map被put或者remove时++).
而当我们使用迭代器Iterator对map进行遍历的时候,在迭代器创建的时候就将modCount赋予给了迭代器里面expectedModCount。
map.remove()时只会修改modCount++,expectedModCount不变.
因此在下一次迭代器执行next()方法的时候 ,就会因为modeCount和expectedModCount这两个不一致而抛出错误。
解决
使用迭代器对数据进行删除.
HashMap<Integer, Integer> map = new HashMap<>();
map.put(1,1);
map.put(2,1);
map.put(3,1);
map.put(4,1);
Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, Integer> entry = iterator.next();
if (entry.getKey() % 2 == 0) {
iterator.remove();
}
}
map.entrySet().stream().forEach(System.out::println);
最后
以上就是无限镜子为你收集整理的解决java.util.ConcurrentModificationException:null场景1:原因:解决方案:场景2原因解决的全部内容,希望文章能够帮你解决解决java.util.ConcurrentModificationException:null场景1:原因:解决方案:场景2原因解决所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复