集合不允许在读取数据的时候对数据进行删除

集合不允许在读取数据的时候对数据进行删除

集合不允许在读取数据的时候对数据进行删除,那为什么删除花花二代时它就没报错?它不就是读取时把它删除吗?而删除花花时就报错了,这里有点不懂?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿慧 2020-09-21 17:28:24

同学你好,

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值。如下:

http://img1.sycdn.imooc.com//climg/5f68722609dc3ec806230299.jpg

每次foreach迭代的时候都有两步操作:

第一步:判断是否有下个元素。 底层会执行如下代码:

http://img1.sycdn.imooc.com//climg/5f68711809db16c306230299.jpg

第二步:cat = iterator.next() 获得下一个元素,并赋值给for循环中的变量。

在调用remove()方法时,会修改modCount的值,但不会修改expectedModCount值。如下:

http://img1.sycdn.imooc.com//climg/5f6871aa09ac9f4706880897.jpg

执行完remove()后,当继续遍历循环时会调用hasNext()方法判断是否有下一个元素。由于这时expectedModCount和modCount值不相等。程序就会抛出异常。如下:

http://img1.sycdn.imooc.com//climg/5f68711809db16c300000000.jpg

祝学习愉快~

好帮手慕阿慧 2020-09-21 14:37:00

同学你好,

1、删除花花二代时没报错是因为花花二代是集合中最后一个元素。在删除花花二代以后,集合也就遍历结束了,这样是不会报错的。

如下:

http://img1.sycdn.imooc.com//climg/5f6849ef09075b8d10310455.jpg

2、删除花花时,因为花花是集合中第一个元素,不是最后一个元素,删除"花花"之后循环会继续执行,这时候就会发生错误。因为删除数据后,集合的存储结构就发生变化了,再遍历就会出错。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~

  • 提问者 bear_programming #1
    删除数据后,集合发生了怎样的存储结构变化?
    2020-09-21 14:41:17
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师