集合不允许在读取数据的时候对数据进行删除
集合不允许在读取数据的时候对数据进行删除,那为什么删除花花二代时它就没报错?它不就是读取时把它删除吗?而删除花花时就报错了,这里有点不懂?
正在回答 回答被采纳积分+1
同学你好,
1、在底层实现中使用到了modCount和expectedModCount。当这两个值不相等时就会抛出java.util.ConcurrentModificationException异常。
modCount从遍历Set集合时产生,表示被修改的次数。当调用remove等方法时,会执行modCount++。
expectedModCount是指期望这个set集合被修改的次数是多少次。是在Iterator初始化的时候将modCount的值赋给了expectedModCount。
2、Java的for循环,就是将Set对象遍历托管给Iterator。如果要对Set进行增删操作,都必须经过Iterator,否则Iterator遍历时会乱,所以直接对Set进行删除时,Iterator会抛出ConcurrentModificationException异常。
在foreach遍历时,底层会初始化expectedModCount和modCount值。如下:
每次foreach迭代的时候都有两步操作:
第一步:判断是否有下个元素。 底层会执行如下代码:
第二步:cat = iterator.next() 获得下一个元素,并赋值给for循环中的变量。
在调用remove()方法时,会修改modCount的值,但不会修改expectedModCount值。如下:
执行完remove()后,当继续遍历循环时会调用hasNext()方法判断是否有下一个元素。由于这时expectedModCount和modCount值不相等。程序就会抛出异常。如下:
祝学习愉快~
- 参与学习 人
- 提交作业 9401 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星