public E set(int index, E element) {
checkElementIndex(index);
Node<E> x = node(index);
E oldVal = x.item;
x.item = element;
return oldVal; // 為何回傳修改前的值?
}
x 是節點的引用。oldVal = x.item 只是複製引用指向同一個物件。隨後 x.item = element 讓節點指向新物件,但 oldVal 仍指向原物件,因此回傳的是舊值。這與 ArrayList 邏輯一致。
List.set 合約:「替換指定位置的元素,並回傳被替換的元素」。get(index)。list.set(i, newVal);。// 呼叫端自行深拷貝
E oldCopy = deepCopy(list.get(index));
list.set(index, newElement);
集合框架不負責深拷貝,遵循「引用語意」是 Java 設計基石。