龙空技术网

迭代器Itr的remove()和ArrayList的remove方法一样吗?

爱码僧 239

前言:

眼前姐妹们对“迭代器remove”大致比较关怀,小伙伴们都想要学习一些“迭代器remove”的相关资讯。那么小编同时在网络上收集了一些对于“迭代器remove””的相关资讯,希望姐妹们能喜欢,你们快快来了解一下吧!

答案是肯定的!

我们查看JDK1.8迭代器Itr(继承自Iterator) 的remove()源码发现:

底层的remove()方法还是调用了ArrayList的remove()方法;

ArrayList.this.remove(lastRet);//这里是在内部类“ Itr ”内访问外部类ArrayList的实例

不同的是:

ArrayList.remove()方法没有更新预期修改集合元素结构的次数“expectModCount”

Itr.remove() 方法同时更新了修改次数”modCount“和预期修改次数“expectModCount”,所以再通过checkForComodification()

方法比较”modCount“和“expectModCount”时是相等的,不会发生fail-fast型的ConcurrentModificationException异常。

但是:

有人说foreach循环是一个语法糖,底层还是用了迭代器。没错,之所以foreach会报错本质原因就是更新了修改次数”modCount“,没有更新预期修改次数“expectModCount”,导致在迭代到next()元素时会被checkForComodification()方法及时检测到并抛出了ConcurrentModificationException异常。

所以如果删除元素不调用next()方法,并及时的break;那么可以成功删除,但这并不是安全的操作!

喜欢的朋友通过关注点赞转发评论支持下,让小编更有动力分享哦!

近期导读:

SQL调优思路

synchronized与Lock的区别从此不会被遗忘

synchronized用法总结

OSI网络七层模型很难记忆吗?不存在的

两步实现Java自定义注解

标签: #迭代器remove