我已经阅读了ArrayList的src代码,我看到类SubList有一个成员thas is name:parentOffset和indexOffset。但我研究了从AbstractList继承的函数clear((,发现:
public void clear() {
removeRange(0, size());
}
protected void removeRange(int fromIndex, int toIndex) {
ListIterator<E> it = listIterator(fromIndex);
for (int i=0, n=toIndex-fromIndex; i<n; i++) {
it.next();
it.remove();
}
}
当涉及parentOffset时,我看不到任何地方,因此无法理解如何使用支持列表来清除";"父";列表
此外,我正在查看ListIterator的源代码,不明白为什么在运行列表时通过迭代器删除项时会引发异常?我试图阅读以下链接中的解释:modcount的角色但不幸的是,这对我没有帮助。
您看到的是包装器方法。
想象一下,我让你做一个蛋糕。你知道蛋糕需要一些面粉,所以…你让你的朋友去给你拿一些,然后你烤你的蛋糕。
你是这样问的人:";你他妈的是怎么做的蛋糕??我从没见过你买面粉&";。
clear()
不做这项工作。Clear让它的朋友来做:它的朋友是removeRange
。
removeRange然后通过向ITS的朋友listIterator()
问几个问题来完成这项工作。
it.remove()
最终调用了listIterator(fromIndex)
生成的listIterator上的remove方法。该代码完成了实际的繁重工作*。
*)或者它也会调用一个朋友。更普遍地说,没有一个方法可以完成所有的工作,因为removeRange确实完成了一些工作:它将"删除范围"的工作变成了"迭代范围"+"删除我们刚刚迭代的元素"的工作。