为什么在 AbstractList 的迭代器的 remove() 方法中检查 if (lastRet < cursor)?
Why check if (lastRet < cursor) in AbstractList's iterator's remove() method?
我正在阅读 openjdk AbstractList 的迭代器部分。我无法弄清楚检查 if (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
}
}
使用 Spotted 提供的 link 中的代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/AbstractList.java#AbstractList.Itr.remove%28%29
代码出现在嵌套的classItr
中。还有另一个嵌套的 class ListItr
扩展了 Itr
。 ListItr
增加了一些新方法,但没有覆盖remove()
,也就是说remove()
的代码在Itr
和ListItr
.[=27中是一样的=]
在ListItr
中,previous()
方法将lastRet
和cursor
设置为相同的东西。因此,调用 remove()
时 lastRet < cursor
并不总是正确的。它似乎总是适用于常规 Itr
,但不适用于 ListItr
。
我正在阅读 openjdk AbstractList 的迭代器部分。我无法弄清楚检查 if (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
}
}
使用 Spotted 提供的 link 中的代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/AbstractList.java#AbstractList.Itr.remove%28%29
代码出现在嵌套的classItr
中。还有另一个嵌套的 class ListItr
扩展了 Itr
。 ListItr
增加了一些新方法,但没有覆盖remove()
,也就是说remove()
的代码在Itr
和ListItr
.[=27中是一样的=]
在ListItr
中,previous()
方法将lastRet
和cursor
设置为相同的东西。因此,调用 remove()
时 lastRet < cursor
并不总是正确的。它似乎总是适用于常规 Itr
,但不适用于 ListItr
。