首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java ArrayList/LinkedList set() 回傳舊值的原因:引用語意

     編輯:程式設計綜合問答

原始碼片段

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 設計基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved