最近有兴趣研究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
初学,欢迎指正,共同进步