关于 java.util.ConcurrentModificationException 的认识

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了关于 java.util.ConcurrentModificationException 的认识脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

今天在遍历arrayList的时候,添加了一些元素进去,然后抛出ConcurrentModificationException 这个异常。然后就去网上找了下资料,抛出这个异常的原因是因为,list 集合 在遍历的时候是不允许修改list的。实质是不允许修改当前遍历list的长度的。

在 arrayList 和 linkedList 的实现里 都一个 modCount 这个遍历。 对于arrayList,在调用remove 和 clean 方法的时候,会修改 modCount 这个变量的值。在遍历的时候这个值被修改了。就会报错。 但我是对arrayList 添加元素。并不是删除,按理来说是不会修改modCount 这个值的。 可还是报错了。后来查看了码。arrayList是用数组实现的。当你添加元素的时候,实现是会去检查数组的大小,是否需要扩容。问题就在这里,在扩容的时候,是会修改modCount 这个值的。

代码入下

  public boolean add(E e) {     ensureCapacityInternal(size + 1);  // Increments modCount!!  次方法用来检查是否要扩大数组的大小     elementData[size++] = e;     return true; }      PRivate void ensureCapacityInternal(int minCapacity) {     if (elementData == EMPTY_ELEMENTDATA) {         // 加入 数组还是为空话,选择默认的大小         minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);     }     //扩大数组的大小     ensureExplicitCapacity(minCapacity); }  private void ensureExplicitCapacity(int minCapacity) {         modCount++;           // overflow-conscious code  传入进来的容量必须大于当前的容量         if (minCapacity - elementData.length > 0)             grow(minCapacity);     }

对于linkedList 的话 你调用add 方法的时候就直接修改modCount 的值了。 因为linkedList是用链表实现的。所以每一次添加其实都是在修改集合的大小。

 private void linkFirst(E e) {         final Node<E> f = first;         final Node<E> newNode = new Node<>(null, e, f);         first = newNode;         if (f == null)             last = newNode;         else             f.prev = newNode;         size++;         modCount++;     }

那我们需要就是要修改大小怎么办呢?
对于 删除元素的话,我们可以用迭代器,然后使用迭代器的 remove 的方法。这个是对于删除来说比较通用的方法。

假如是要添加元素的的话。我没有找到很好的方法。我是用另外要给list 暂时存放需要的添加的元素。等遍历完以后,再把,需要添加的元素一起放进去。不知哪位高人有更好的方法。

脚本宝典总结

以上是脚本宝典为你收集整理的关于 java.util.ConcurrentModificationException 的认识全部内容,希望文章能够帮你解决关于 java.util.ConcurrentModificationException 的认识所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。