我正在阅读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
}
}
答案 0 :(得分:1)
代码出现在嵌套类Itr
中。还有一个扩展ListItr
的另一个嵌套类Itr
。 ListItr
添加了一些新方法,但未覆盖remove()
,这意味着remove()
和Itr
中ListItr
的代码相同。
在ListItr
中,previous()
方法将lastRet
和cursor
设置为相同的内容。因此,调用lastRet < cursor
时remove()
并非总是如此。对于常规Itr
似乎总是如此,但在ListItr
中则不然。