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

Arrays.asList() 返回固定長度列表陷阱:不支援增刪操作

     編輯:Java 相關知識

核心結論

Arrays.asList(...) 返回的是 **java.util.Arrays.ArrayList**(內部類),**非** java.util.ArrayList。它是對原始陣列的**視圖包裝**,特性:

  • ✅ 固定長度,不可 add()/remove()(拋 UnsupportedOperationException)
  • ✅ 支援 get()/set()/contains()/iterator()
  • ✅ 修改元素值會**同步反映到原陣列**
  • ✅ 實現 RandomAccess、Serializable

官方文檔定義

public static <T> List<T> asList(T... a)
返回受指定陣列支援的**固定大小列表**。對返回列表的修改會「直寫」到陣列。此方法在陣列 API 與 Collection API 間架起橋樑。

代碼驗證

import java.util.*;

public class AsListDemo {
    public static void main(String[] args) {
        String[] arr = {"Larry", "Moe", "Curly"};
        List list = Arrays.asList(arr);

        System.out.println("原始列表: " + list); // [Larry, Moe, Curly]
        System.out.println("實際類別: " + list.getClass().getName()); // java.util.Arrays$ArrayList

        // ✅ 允許:修改元素值
        list.set(1, "Moe Modified");
        System.out.println("修改後列表: " + list); // [Larry, Moe Modified, Curly]
        System.out.println("原陣列同步變化: " + Arrays.toString(arr)); // [Larry, Moe Modified, Curly]

        // ❌ 禁止:改變長度
        try {
            list.add("Shemp"); // UnsupportedOperationException
        } catch (UnsupportedOperationException e) {
            System.out.println("add() 失敗: " + e.getMessage());
        }

        try {
            list.remove(0); // UnsupportedOperationException
        } catch (UnsupportedOperationException e) {
            System.out.println("remove() 失敗: " + e.getMessage());
        }
    }
}

常見誤區與正確替代方案

場景錯誤寫法正確寫法
需要可變長度 ListList list = Arrays.asList("a","b"); list.add("c");List list = new ArrayList<>(Arrays.asList("a","b")); list.add("c");
僅需遍歷/查詢無直接用 Arrays.asList(),零拷貝、效能最優
基本型別陣列Arrays.asList(new int[]{1,2,3}) → 返回 List(單一元素)用 IntStream.of(arr).boxed().collect(Collectors.toList()) 或手動裝箱

.NET 對比視角

在 .NET 中,陣列與 List 皆實作 IList 介面,透過介面訪問陣列時行為與 Arrays.asList() 類似:固定大小、可修改元素值。Java 選擇以專用內部類實現,設計意圖相同。

適用場景

  • 快速建立**只讀**測試資料:List stooges = Arrays.asList("Larry", "Moe", "Curly");
  • 將陣列傳遞給要求 Collection/List 參數的 API(不修改長度)
  • 陣列與集合互轉的橋樑:Collection.toArray() ↔ Arrays.asList()

總結

Arrays.asList() 是陣列的「唯讀視圖」,而非獨立集合。理解其固定長度、共享底層陣列的本質,避免誤調 add/remove,需要可變列表時請顯式拷貝至 new ArrayList<>()。正確使用能減少物件創建、提升效能。

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