List的迭代器itertor和ListItertor的源码探究

最近有兴趣研究jdk1.8的部分源码,看了一段关于链表迭代器的问题。

出发点:l使用1.8后发现,iterator可以在遍历过程中增删数据,源码发现做了如下修改:


也就是说 所有的list的迭代器都返回了listItertor.

为了理解为什么listIterator可以增删数据,截取了一段1.8中的代码实现。


首先判断lastRet是否小于0,lastRet代表的是迭代器上一次指向的元素,初始化为-1,如果迭代器在刚刚获取之后,不调用Next直接remove就出现IllegalStateException异常。

第二个方法:checkForComodification();

实现很简单,判断list是否进行了修改,在add,remove方法中都对修改标记自增。当发现被修改后,直接报错。(判断方式,list中定义的修改次数与期望修改次数相同则认为未修改)

这就是在1.6版本中iterator迭代器无法在轮询中新增和删除元素的原因。

listIterator为什么可以呢?

继续看代码 try-cache中首先删除了上一个元素(lastRet所指向的元素)。

当前游标移到上一个元素的位置。

lastRet又回到初始化的形态-1(此时调用remove方法依然报错,也就是说 连输调用两次remove方法会报错)

最后一步:关键一步 期望的修改数=修改次数

当下一次next操作时调用checkForComodification检查时,由于修改次数等于期望修改数,所以不会检查失败。over

初学,欢迎指正,共同进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值