在線路
list2 = list.subList(2, 5);
您所呼叫的ArrayList
subList
方法從list
稱作。它的代碼看起來像這樣
public List<E> subList(int fromIndex, int toIndex) {
subListRangeCheck(fromIndex, toIndex, size);
return new SubList(this, 0, fromIndex, toIndex);
}
所以確認有效範圍列表2將存儲
new SubList(this, 0, fromIndex, toIndex);
其中private class SubList extends AbstractList<E>
的內部ArrayList
定義的類與此構造的代碼看起來像這樣
SubList(AbstractList<E> parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = ArrayList.this.modCount;
}
結果後
所以其parent
字段將存儲參考原始ArrayList
(new SubList(this, ...)
)。
現在當你調用
list2.clear();
代碼通過SubList
從AbstractList
繼承clear()
方法將被調用
public void clear() {
removeRange(0, size());
}
其中它將在內部調用removeRange
覆蓋在SubList
protected void removeRange(int fromIndex, int toIndex) {
checkForComodification();
parent.removeRange(parentOffset + fromIndex,
parentOffset + toIndex);
this.modCount = parent.modCount;
this.size -= toIndex - fromIndex;
}
所以你看到的那樣,結果你調用
parent.removeRange(parentOffset + fromIndex,
parentOffset + toIndex);
這裏你還記得parent
持有參考ArrayList的上subList
被調用。所以通過調用clear
有效地從您創建子列表的原始列表中調用removeRange
。
我知道,我已經閱讀過。但是在內存中究竟發生了什麼? –
你是指什麼在內存中發生什麼?就像任何引用同一事物的東西一樣。這裏沒有什麼特別 –
@ShubhamKharde:我試圖擴大我的答案。如果你仍然有問題,你將需要看看如何引用一般工作。 – npinti