java常见小错误(二):Java迭代器iterator和for循环的区别

本文介绍了在Java中使用迭代器iterator和for循环遍历集合时可能出现的错误,特别是并发修改异常。错误原因在于在遍历过程中直接调用集合的remove方法,而非使用迭代器的remove方法。文章详细分析了fail-fast机制,并讨论了foreach循环与Iterator的关系,以及在不同数据结构中选择合适遍历方式的重要性。此外,还探讨了如何解决集合遍历中的常见问题,如漏删现象,以及使用Java 8新特性filter的解决方案。
摘要由CSDN通过智能技术生成

java常见小错误(二):Java迭代器iterator和for循环的区别

java常见错误系列文章
下一篇:java常见小错误(一):变量类型自动转换与强制转换
往期文章推荐:
  java小技巧(三):JAVA 交集,差集,并集
  java小技巧(二):进制转换


【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权);
本博客的内容来自于:java常见小错误(二):Java迭代器iterator和for循环的区别
学习、合作与交流联系q384660495;
本博客的内容仅供学习与参考,并非营利;



一、常见错误

在Iterator迭代器迭代过程或者foreach循环中,调用Collection的remove(obj)方法,要么会报错(并发修改的错误),要么行为不确定。
常见异常

二、错误原因

foreach底层也是使用了iterator的方法。foreach反编译结果如下:
反编译结果
fail-fast,即快速失败,它是Java集合的一种错误检测机制。 当多个线程对集合(非fail-safe的集合类)进行结构上的改变的操作时,有可能会产生fail-fast机制,这个时候就会抛出ConcurrentModificationException(当方法检测到对象的并发修改,但不允许这种修改时就抛出该异常)。

同时需要注意的是,即使不是多线程环境,如果单线程违反了规则,同样也有可能会抛出改异常。

那这又和foreach循环有什么关系呢?
上文分析到了,foreach的底层是迭代器实现的,由debug发现,在迭代器中使用Iterator.next 会调用 Iterator.checkForComodification方法 ,而异常就是checkForComodification方法中抛出的。

我们直接看下checkForComodification方法的代码,看下抛出异常的原因:
异常

  • modCount是ArrayList中的一个成员变量。它表示该集合实际被修改的次数。

  • expectedModCount 是 ArrayList中的一个内部类——Itr中的成员变量。expectedModCount表示这个迭代器期望该集合被修改的次数。其值是在ArrayList.iterator方法被调用的时候初始化的。只有通过迭代器对集合进行操作,该值才会改变。

  • Itr是一个Iterator的实现,使用ArrayList.iterator方法可以获取到的迭代器就是Itr类的实例。

他们之间关系:
关系

由上图可知,迭代器开始遍历之前该迭代器的expectedModCount (期望集合修改次数ÿ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的爱人是绿色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值