1. 介紹
在 Java 程式設計中,「List 初始化」是最基礎且最重要的概念之一。相較於陣列,List 支援動態調整大小,且有多種實作(如 ArrayList、LinkedList),因此在日常開發任務中被廣泛使用。然而,許多開發者仍會困惑於「該使用哪種初始化方式?」或「各種做法之間有何差異?」等問題。
本文將清楚說明 Java 中 List 的基本特性、初始化的目的,以及可供選擇的不同初始化方法——特別針對新手。除此之外,我們也會提供實務上常見的範例、常見陷阱,以及如何依據使用情境挑選最適合的方式。如果你想學會最佳的 List 初始化技巧,或在與其他文章的比較中取得優勢,這篇指南將非常有幫助。
2. List 基礎與初始化的重要性
在 Java 中,List 是一種可以儲存有序、可變長度資料的集合。最常使用的實作是 ArrayList,但還有 LinkedList、Vector 等多種選擇。相較於陣列,List 提供彈性的大小調整以及簡易的新增、刪除操作。
【List 的特性】
- 保留順序:元素會依插入的順序保存。
- 允許重複:可存放多個相同的值。
- 動態大小:不需要事先指定大小,元素可以自由加入或移除。
然而,不同的初始化方式會有不同的行為表現,依據目標選擇合適的方法相當重要。
【為何初始化很重要】
選擇正確的 List 初始化技巧高度取決於你的使用情境。例如:
- 建立空的 List 只需要一個簡單的方法。
- 建立帶有初始值的 List 可能需要另一種做法。
- 若需要不可變的 List,則某些方法較為適合。
此外,現代 Java 版本提供了更簡潔的語法以提升效能。了解這些選項能顯著提升開發效率。
【List 與陣列的差異】
Java 陣列是固定長度的,必須在宣告時決定大小。相對地,List 支援動態調整大小,因而在實務上更受青睞。但根據不同的初始化技巧與內部實作,可能會出現效能差異或功能限制,正確的使用方式相當重要。
3. 五種 List 初始化方式
Java 提供了多種初始化 List 的方法。最適合的方式取決於你的使用情境、Java 版本,以及之後是否需要新增或刪除元素。本節將說明五種常見的初始化技巧,並說明其特性與最佳使用情境。
3.1 建立空的 List
這是最基礎的初始化方式,適用於想先得到一個空 List,之後再自行加入元素的情況。
List<String> list = new ArrayList<>();
- 使用情境:之後會加入元素時。
- 重點:最初為空,但可透過
add()任意加入元素。若有需要,也可以改用其他實作(如LinkedList)以符合不同需求。
3.2 使用 Arrays.asList
當你想快速從多個值或陣列建立 List 時,Arrays.asList() 十分便利。只要一行程式碼即可產生帶有初始值的 List。
List<String> list = Arrays.asList("A", "B", "C");
- 使用情境:從多個固定值建立 List 時。
- 注意:此方式建立的 List 大小固定,不允許使用
add()或remove()進行新增或刪除。但可使用set()變更已存在的值。 - 若需修改:可再建立新的
ArrayList,範例如下:List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
3.3 使用 List.of(Java 9 以上)
從 Java 9 開始,List.of() 讓建立 不可變 List 變得簡單。
List<String> list = List.of("A", "B", "C");
- 使用情境:當內容固定且不需要變更時。
- 特性:使用此方法建立的 List 為 完全不可變。不允許任何修改——包括
add()、remove(),甚至set()。這非常適合常數與安全關鍵資料。
3.4 使用實例初始化子
這種較少使用的技巧在匿名類別中使用實例初始化子,允許在單一表達式內進行多行或複雜的初始化。
List<String> list = new ArrayList<>() {{
add("A");
add("B");
add("C");
}};
- 使用情境:需要大量元素或複雜的初始化邏輯時。
- 注意:因會產生匿名類別,基於記憶體與可維護性考量,不建議在大型專案或效能關鍵環境中使用。
3.5 以初始容量建立 ArrayList
List<String> list = new ArrayList<>(100);
- 使用情境:預期會插入大量元素且已知大致大小時。
- 好處:減少內部重新調整大小的操作,提升效能。
多樣的初始化方法讓 Java 開發者能依情境選擇最有效的方式。
4. 各初始化方法比較
本節比較先前介紹的五種初始化技巧,提供條理化的概覽,協助在不確定時決定使用哪種方法。
【主要比較點】
| Initialization Method | Add/Remove | Modify Values | Immutability | Recommended Use Case |
|---|---|---|---|---|
| new ArrayList<>() | Yes | Yes | No | General List operations |
| Arrays.asList(…) | No | Yes | Partial (fixed size) | When converting an array to a List and only modifying existing values |
| new ArrayList<>(Arrays.asList(…)) | Yes | Yes | No | When you need both initial values and modifiable size |
| List.of(…) | No | No | Excellent | When a fully immutable constant List is required |
| Instance initializer | Yes | Yes | No | When initializing complex or multi-line values at once |
| new ArrayList<>(initial capacity) | Yes | Yes | No | When handling many elements and optimizing performance |
【關鍵選擇指引】
- 如果之後需要新增或移除元素 ⇒
new ArrayList<>()或new ArrayList<>(Arrays.asList(...)) - 如果想要由固定值建立 List,且不會新增/移除 ⇒
Arrays.asList(...) - 如果需要完全不可變的 List(安全關鍵) ⇒
List.of(...)(Java 9 以上) - 如果需要多行或複雜的初始化邏輯 ⇒ 實例初始化子
- 如果預期有大量元素且想提升效能 ⇒
new ArrayList<>(initial capacity)
【備註】
- 由
Arrays.asList建立的 List 大小固定——新增或移除元素會拋出UnsupportedOperationException。 List.of支援零個或多個元素,但它是不可變的——無法使用 add、remove 與 set。- 實例初始化子功能強大,但會產生匿名類別,可能影響可讀性與效能。
根據使用目的、安全性與效能選擇合適的初始化方法,是有效 Java 開發的關鍵。
5. 實作使用範例
本節提供先前介紹的每種 List 初始化方法的實作範例,透過具體情境的檢視,讓您更了解哪種方法最適合自己的使用情境。
5.1 建立空 List 並於之後加入值
List<String> names = new ArrayList<>();
names.add("Satou");
names.add("Suzuki");
names.add("Takahashi");
System.out.println(names); // Output: [Satou, Suzuki, Takahashi]
說明:
這是最基本的用法。當您想事先準備一個空 List,之後再加入值(例如來自使用者輸入或迴圈)時非常有用。
5.2 使用 Arrays.asList 建立固定大小的 List
List<String> fruits = Arrays.asList("Apple", "Banana", "Mikan");
System.out.println(fruits); // Output: [Apple, Banana, Mikan]
// fruits.add("Grape"); // ← This will cause an error
fruits.set(0, "Pineapple"); // This is allowed
System.out.println(fruits); // Output: [Pineapple, Banana, Mikan]
說明:
此方法適合處理固定資料集或立即處理值的情況。但不允許新增或移除元素,需特別留意。

5.3 使用 List.of(Java 9 以上)建立不可變 List
List<String> colors = List.of("Red", "Blue", "Green");
System.out.println(colors); // Output: [Red, Blue, Green]
// colors.add("Yellow"); // ← Will throw an exception
說明: 這適用於不應被修改的常數清單或值,特別是在安全性與不可變性很重要的情況下。
5.4 使用實例初始化子設定複雜的初始值
List<Integer> numbers = new ArrayList<>() {{
for (int i = 1; i <= 5; i++) {
add(i * i); // 1, 4, 9, 16, 25
}
}};
System.out.println(numbers); // Output: [1, 4, 9, 16, 25]
說明: 當需要在初始化時使用迴圈、條件或複雜邏輯時很有用。它功能強大,但因匿名類別的額外開銷,在大型系統中不建議使用。
5.5 以初始容量加入大量資料
List<Integer> bigList = new ArrayList<>(1000);
for (int i = 0; i < 1000; i++) {
bigList.add(i);
}
System.out.println(bigList.size()); // Output: 1000
說明: 處理大型資料集時,指定初始容量可減少重新調整大小的操作,提升效能。根據實際情境選擇正確的初始化方式,可改善可讀性、效能與可維護性。
6. 小結
在本篇文章中,我們探討了在 Java 中初始化 List 的多種方法——從基本概念與實作範例,到比較與最佳實踐。雖然 List 的初始化乍看之下似乎很簡單,但最佳方法會因使用情境與需求而有很大差異。
重點回顧:
- List 有順序、允許重複,且支援動態調整大小,較陣列更具彈性。
- Java 提供多種初始化方式:空 List、帶初始值的 List、不可變 List、具指定初始容量的 List 等。
- 選擇適當的方法取決於是否需要新增/移除元素、處理固定資料、確保不可變性,或有效管理大量資料集。
Arrays.asList與List.of各有特定限制(固定大小或完全不可變),因此必須了解其行為。
當您在實務開發或學習中遇到 List 初始化時,請回顧本指南以選擇最合適的方法。希望本篇文章能協助您撰寫更安全、更高效的 Java 程式碼。
7. 常見問題 (FAQ)
Q1:我可以向使用 Arrays.asList 建立的 List 中加入元素嗎?
A1:不能。使用 Arrays.asList 建立的 List 大小固定,呼叫 add() 或 remove() 會拋出 UnsupportedOperationException。但可以使用 set() 覆寫已有的值。若需要可修改的 List,可這樣轉換:
new ArrayList<>(Arrays.asList(...))
Q2:List.of 與 Arrays.asList 有何差異?
A2:
List.of(Java 9 以上)建立的是 完全不可變 的 List。任何修改都不允許,甚至set()也不行。Arrays.asList建立的是 固定大小 的 List。雖不能新增或移除元素,但可以使用set()覆寫值。
兩者皆不允許 add() 與 remove(),但 List.of 提供更強的不可變性。若安全性與不可變性是首要考量,建議使用 List.of。
Q3:在初始化 List 時指定初始容量有什麼好處?
A3:使用 ArrayList 時,若預期會加入大量元素,指定初始容量可減少內部陣列的重新調整次數,提升效能。若事先知道大致的元素數量,設定初始容量可避免不必要的記憶體重新配置。
Q4:為何在使用實例初始化子時需要特別小心?
A4:實例初始化子會在背後產生匿名類別,可能導致:
- 記憶體使用量增加
- 可維護性降低
- 序列化時可能產生問題
雖然對於短小且複雜的初始化很方便,但在大規模或對效能敏感的環境中並不理想。
Q5:我該如何初始化 LinkedList?
A5:
LinkedList 的初始化方式與 ArrayList 類似。例如:
List<String> list = new LinkedList<>();
您也可以使用其他方法來初始化 LinkedList:
new LinkedList<>(existingList)- 使用
Arrays.asList或List.of結合轉換
我們希望此 FAQ 章節能幫助您解答疑問。
了解 List 的初始化方式將有助於撰寫更乾淨、更安全且更高效的 Java 程式。

