ArrayList中remove的疑问

un-real 2017-09-22 05:03:34

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if ("2".equals(s)) {
list.remove(s);
}
}


为什么可以执行成功呢?iterator.next()的时候明明会对比modCount和expectedModCount的大小,而expectedModCount的值又是list.iterator()的时候初始化好的,那么remove后,modCount会增加,而expectedModCount不变,比较之后,应该抛出异常才对啊?
...全文
307 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
un-real 2017-09-22
  • 打赏
  • 举报
回复
引用 3 楼 dannil00 的回复:
我补充下,modCount和expectedModCount的比较是在调用next()的时候,楼主的示例总共就3个元素,并且remove掉2以后,实际已经完成迭代了,因为游标是2 这时候list的长度也是2,所以不会进入循环,就没有调用next了,如果改成remove掉1,那就不一样了,游标1根list的修改后的长度不等,所以继续迭代,调用next方法,判断不等就抛出异常了
感谢了,我之前最下面还有个foreach,断点查看的时候,foreach里也会进去比较,我误以为remove("2")以后还能进去,这下就没问题了。
  • 打赏
  • 举报
回复
因为对,迭代器的底层不是很熟悉,百度了一下, http://blog.csdn.net/androidboy365/article/details/50540202/ 这个转帖还有下面的推荐帖,可以看一下。感谢lz分享问题
幻乐星空 2017-09-22
  • 打赏
  • 举报
回复
我补充下,modCount和expectedModCount的比较是在调用next()的时候,楼主的示例总共就3个元素,并且remove掉2以后,实际已经完成迭代了,因为游标是2 这时候list的长度也是2,所以不会进入循环,就没有调用next了,如果改成remove掉1,那就不一样了,游标1根list的修改后的长度不等,所以继续迭代,调用next方法,判断不等就抛出异常了
幻乐星空 2017-09-22
  • 打赏
  • 举报
回复
你把"2".equals(s)改成"1".equals(s)就是你想要的结果了
戎码一生灬 2017-09-22
  • 打赏
  • 举报
回复
下标从0开始的,你的String s = iterator.next();获取到的只是list的下标,并不是获取list里面存的值

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧