我是靠谱客的博主 无限镜子,最近开发中收集的这篇文章主要介绍解决java.util.ConcurrentModificationException:null场景1:原因:解决方案:场景2原因解决,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

场景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原因解决所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部