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

来源:3-14 删除宠物猫信息

bear_programming

2020-09-21 09:58:51

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

写回答

2回答

好帮手慕阿慧

2020-09-21

同学你好,

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

如下:

http://img.mukewang.com/climg/5f6849ef09075b8d10310455.jpg

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

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

1
hear_programming
h 删除数据后,集合发生了怎样的存储结构变化?
h020-09-21
共1条回复

好帮手慕阿慧

2020-09-21

同学你好,

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://img.mukewang.com/climg/5f68722609dc3ec806230299.jpg

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

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

http://img.mukewang.com/climg/5f68711809db16c306230299.jpg

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

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

http://img.mukewang.com/climg/5f6871aa09ac9f4706880897.jpg

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

http://img.mukewang.com/climg/5f68711809db16c300000000.jpg

祝学习愉快~

0

0 学习 · 16556 问题

查看课程