为什么在AbstractList的迭代器的remove()方法中检查是否(lastRet< cursor)?

时间:2016-03-04 06:52:21

标签: java openjdk listiterator

我正在阅读openjdk AbstractList的迭代器部分。我无法弄清楚检查是否(lastRet< cursor),这对我来说总是正确的。

这里,lastRet是next()最后返回的值的索引,而cursor是next()返回的值的索引。

代码如下:

public void remove() {
    if (lastRet < 0) {...} // throw exception
    checkForComodification();
    try {
        AbstractList.this.remove(lastRet);
        if (lastRet < cursor) // WHY??????????
            cursor--;
        lastRet = -1;
        expectedModCount = modCount;
    } catch (...) {
        ... // some exception
    }
 }

1 个答案:

答案 0 :(得分:1)

使用Spotted:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/AbstractList.java#AbstractList.Itr.remove%28%29

提供的链接中的代码

代码出现在嵌套类Itr中。还有一个扩展ListItr的另一个嵌套类ItrListItr添加了一些新方法,但未覆盖remove(),这意味着remove()ItrListItr的代码相同。

ListItr中,previous()方法将lastRetcursor设置为相同的内容。因此,调用lastRet < cursorremove()并非总是如此。对于常规Itr似乎总是如此,但在ListItr中则不然。