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

【Java每日一題】20170105:ArrayList 構造器與 subList 的 equals 行為差異

     編輯:Java 綜合教學

【Java每日一題】20170105:ArrayList 構造器與 subList 的 equals 行為差異

題目來源:微信公眾號「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

解析

  1. new ArrayList<>(list) 創建獨立副本,元素相同但為不同對象,equals 比較元素內容 → true。
  2. 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 比較,順序敏感。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved