1. 介紹
在 Java 程式設計中,List 是最常使用且最重要的資料結構之一。使用 List 可以依序儲存多個項目,並且能輕鬆執行新增、刪除、搜尋等操作。 然而,要有效使用 List,必須完整了解 初始化方法。不正確的初始化會導致意外的錯誤或 Bug,並且嚴重影響程式的可讀性與可維護性。 本文聚焦於 「Java List 初始化」 主題,說明從適合初學者的基本初始化方法到實務技巧與常見陷阱。我們也會比較不同 Java 版本的差異,並提供基於真實開發情境的最佳實踐。 無論你是剛開始學習 Java,或是已經常常使用 List,這都是一次檢視與整理各種初始化模式的好機會。 最後附上 FAQ 區塊,協助解決常見問題與疑慮。
2. 基本 List 初始化方法
剛開始使用 List 時,第一步就是建立「空的 List」,也就是對 List 進行初始化。以下以最常見的實作 ArrayList 為例,說明基本的初始化方式。
2.1 使用 new ArrayList<>() 建立空 List
最常見的初始化方式是使用 new ArrayList<>(),寫法如下:
List<String> list = new ArrayList<>();
這會建立一個沒有任何元素的空 List。
重點說明:
List是介面,必須實例化具體的類別,例如ArrayList或LinkedList。- 為了彈性,通常建議將變數宣告為
List型別。
2.2 以指定的初始容量初始化
如果預期會儲存大量資料或已知元素數量,指定初始容量可以提升效能。範例:
List<Integer> numbers = new ArrayList<>(100);
此做法在內部為 100 個元素預留空間,減少加入項目時的重新調整成本,提升效能。
2.3 初始化 LinkedList
視需求也可以使用 LinkedList。用法幾乎相同:
List<String> linkedList = new LinkedList<>();
LinkedList 在元素頻繁新增或刪除的情況下特別有效。
Java 只要使用 new ArrayList<>() 或 new LinkedList<>() 就能輕鬆建立空的 List。
3. 建立含有初始值的 List
在許多情況下,我們會想要建立一個已包含初始值的 List。以下列出最常見的初始化模式及其特性。
3.1 使用 Arrays.asList()
在 Java 中最常使用的方法之一是 Arrays.asList()。範例:
List<String> list = Arrays.asList("A", "B", "C");
這會建立一個帶有初始值的 List。
重要說明:
- 回傳的 List 為 固定大小,長度不可變。呼叫
add()或remove()會拋出UnsupportedOperationException。 - 允許使用
set()取代元素。
3.2 使用 List.of()(Java 9 以上)
自 Java 9 起,List.of() 可輕鬆建立 不可變 List:
List<String> list = List.of("A", "B", "C");
特性:
- 完全不可變的 List——
add()、set()、remove()全部被禁止。 - 可讀性高,適合用於常數值。
3.3 從 Arrays.asList() 建立可變 List
如果想要一個帶有初始值且之後仍能修改的 List,這個方法很實用:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
這會建立一個可變的 List。
add()與remove()正常運作。
3.4 雙大括號初始化
較進階的技巧,利用匿名類別:
List<String> list = new ArrayList<>() {{
add("A");
add("B");
add("C");
}};
特性與警告:
- 產生精簡的程式碼,但會產生匿名類別,導致額外的開銷與可能的記憶體洩漏。
- 僅用於快速示範或測試程式碼;不建議在正式環境使用。
這說明了 Java 提供了多種依需求建立具有初始值的 List 的方式。
5. 比較與選擇標準
Java 提供了多種 List 初始化方法,最佳選擇取決於 使用情境。本節將彙總每種方法並說明何時該選擇哪一種。
5.1 可變與不可變 List
- 可變 List
- 元素可以新增、刪除或修改。
- 範例:
new ArrayList<>()、new ArrayList<>(Arrays.asList(...)) - 適合動態操作或在迴圈中加入項目。
- 不可變 List
- 不允許新增、刪除或修改。
- 範例:
List.of(...)、Collections.singletonList(...)、Collections.nCopies(...) - 適用於常數或安全的值傳遞。
5.2 常見方法比較表
| Method | Mutability | Java Version | Characteristics / Use Cases |
|---|---|---|---|
new ArrayList<>() | Mutable | All Versions | Empty List; add elements freely |
Arrays.asList(...) | Fixed Size | All Versions | Has initial values but size cannot change |
new ArrayList<>(Arrays.asList(...)) | Mutable | All Versions | Initial values + fully mutable; widely used |
List.of(...) | Immutable | Java 9+ | Clean immutable List; no modifications allowed |
Collections.singletonList(...) | Immutable | All Versions | Immutable List with a single value |
Collections.nCopies(n, obj) | Immutable | All Versions | Initialize with n identical values; useful for testing |
Stream.generate(...).limit(n) | Mutable | Java 8+ | Flexible pattern generation; good for random or sequential data |
5.3 依使用情境推薦的初始化模式
- 當只需要空的 List 時
new ArrayList<>()- 當需要初始值且之後想要修改時
new ArrayList<>(Arrays.asList(...))- 當將其作為不會變動的常數使用時
List.of(...)(Java 9 以上)Collections.singletonList(...)- 當需要固定數量的相同值時
Collections.nCopies(n, value)- 當值需要動態產生時
Stream.generate(...).limit(n).collect(Collectors.toList())

5.4 重要注意事項
- 嘗試修改不可變或固定大小的 List 會拋出例外。
- 選擇最符合所需可變性與 Java 版本的方法。
選擇正確的初始化方法可防止 非預期的錯誤,並提升可讀性與安全性。
6. 常見錯誤與解決方式
在 Java 中初始化或使用 List 時常會發生某些錯誤。以下列出常見範例與解決方法。
6.1 UnsupportedOperationException
常見情境:
- 在透過
Arrays.asList(...)建立的 List 上呼叫add()或remove() - 修改透過
List.of(...)、Collections.singletonList(...)或Collections.nCopies(...)建立的 List
範例:
List<String> list = Arrays.asList("A", "B", "C");
list.add("D"); // Throws UnsupportedOperationException
原因:
- 這些方法會產生無法改變大小或完全不可變的 List。
解決方案:
- 包裝成可變的 List:
new ArrayList<>(Arrays.asList(...))
6.2 NullPointerException
常見情境:
- 存取從未初始化的 List
範例:
List<String> list = null;
list.add("A"); // NullPointerException
原因:
- 在
null參考上呼叫方法。
解決方案:
- 使用前務必先初始化:
List<String> list = new ArrayList<>();
6.3 型別相關問題
- 未使用泛型建立 List 會增加執行時型別錯誤的風險。
範例:
List list = Arrays.asList("A", "B", "C");
Integer i = (Integer) list.get(0); // ClassCastException
解決方案:
- 盡可能總是使用泛型。
了解這些常見錯誤可協助您 避免在初始化或使用 List 時的問題。
7. 小結
本文說明了 Java 中各種 List 初始化方法以及如何選擇適當的方式。
我們涵蓋了:
- 使用
new ArrayList<>()與new LinkedList<>()建立基本的空 List - 使用
Arrays.asList()、List.of()與new ArrayList<>(Arrays.asList(...))建立帶初始值的 List - 特殊初始化模式 如
Collections.singletonList()、Collections.nCopies()、Stream.generate() - 可變與不可變 List 的關鍵差異
- 常見陷阱與錯誤處理
雖然 List 的初始化看似簡單,但了解這些差異並選擇正確的方法對於安全且高效的程式開發至關重要。
8. FAQ(常見問題)
Q1:我可以向 Arrays.asList() 建立的 List 中加入元素嗎?
A1:不能。Arrays.asList() 會回傳一個固定大小的 List。呼叫 add() 或 remove() 會拋出 UnsupportedOperationException。若需要可變的 List,請使用 new ArrayList<>(Arrays.asList(...))。
Q2:List.of() 與 Arrays.asList() 有什麼差別?
List.of()(Java 9 以上)→ 完全不可變;甚至不允許set()。Arrays.asList()→ 固定大小,但允許set()。
Q3:我應該使用雙大括號初始化嗎?
A3:不建議,因為它會產生匿名類別,可能導致記憶體泄漏。請改用一般的初始化方式。
Q4:指定初始容量有什麼好處?
A4:在加入大量元素時可減少內部重新調整大小的次數,提升效能。
Q5:在初始化 List 時我應該總是使用泛型嗎?
A5:絕對應該。使用泛型能提升型別安全,避免執行時錯誤。
Q6:如果我使用未初始化的 List 會發生什麼事?
A6:對其呼叫任何方法都會導致 NullPointerException。請務必先完成初始化。
Q7:List 初始化在不同版本間有差異嗎?
A7:有。List.of() 只在 Java 9 及之後的版本提供。

