題目來源:微信公眾號「weknow619」,GitHub 專案同步更新。
package Jan2017;
import java.util.ArrayList;
import java.util.List;
public class Ques0105 {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("a");
// 使用構造器創建副本
List list1 = new ArrayList<>(list);
// 使用 subList 獲取視圖
List list2 = list.subList(0, list.size());
list2.add("b"); // 修改視圖會影響原列表
System.out.println(list.equals(list1)); // true
System.out.println(list.equals(list2)); // false
}
}
true false
new ArrayList<>(list) 創建獨立副本,元素相同但為不同對象,equals 比較元素內容 → true。list.subList(0, list.size()) 返回原列表的視圖,非獨立副本。對視圖的修改(如 add("b"))會直接反映到原列表 list,導致 list 變為 ["a", "b"],而 list1 仍為 ["a"],故 list.equals(list2) 比較的是 ["a","b"] 與 ["a","b"] → 應為 true?list2.add("b") 會修改底層 list,使 list 也變為 ["a","b"],此時 list.equals(list2) 應為 true。但題目給出的輸出為 false,可能題目環境或 JDK 版本差異導致 subList 返回的視圖在結構修改後 equals 行為異常,或題目原碼有筆誤。建議實際運行驗證。ArrayList(Collection) 構造器:淺拷貝,創建新數組。subList:返回視圖,底層共享數組,結構修改會拋 ConcurrentModificationException 或影響原列表。List.equals:逐元素調用 equals 比較,順序敏感。