理解 Java 中的 Arrays.asList 和 java.util.ArrayList 的區別
在 Java 編程中,Arrays.asList
方法和 java.util.ArrayList
是兩種常用的處理列表數據的方式。雖然它們在功能上看起來相似,但在內部實現和使用上有著本質的不同。本文將探討這兩種方式的區別,以及為什么 Arrays.asList
返回的是一個固定大小的列表。
什么是 Arrays.asList?
Arrays.asList
是一個靜態方法,它將一個數組轉換成一個固定大小的列表。這個方法返回的是 java.util.Arrays$ArrayList
類的實例,這是一個內部的、私有的靜態類。關鍵點在于,這個返回的列表是直接由原始數組支持的。這意味著,當你修改這個列表時,實際上是在修改原始數組中的數據。
主要特性:
- 固定大小:通過
Arrays.asList
創建的列表不能增加或減少元素。嘗試添加或刪除元素將拋出UnsupportedOperationException
。 - 高效:因為列表是數組的直接視圖,所以沒有額外的內存分配和數據復制。
什么是 java.util.ArrayList?
相比之下,java.util.ArrayList
是一種基于數組實現的可變大小的列表集合。它實現了 List
接口,并提供了動態數組的功能,這意味著它可以在運行時根據需要增長和縮小。
主要特性:
- 可變大小:可以自由地添加和刪除元素。
- 獨立于原始數組:
ArrayList
通常是從一個數組或集合復制數據而來,但它存儲的數據是獨立的,修改ArrayList
不會影響原始數據。
Arrays.asList的返回值變為 java.util.ArrayList
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;public class ListExample {public static void main(String[] args) {// 創建一個數組Integer[] array = {1, 2, 3};// 使用 Arrays.asList() 創建一個列表List<Integer> fixedSizeList = Arrays.asList(array);// 將固定大小的列表轉換為可變的 ArrayListList<Integer> arrayList = new ArrayList<>(fixedSizeList);// 現在可以自由添加和刪除元素arrayList.add(4); // 添加元素arrayList.remove(Integer.valueOf(2)); // 刪除元素// 輸出修改后的列表內容System.out.println(arrayList);}
}
關鍵步驟:
-
創建固定列表:首先使用
Arrays.asList()
方法將數組轉換成一個固定大小的列表。這個列表是由原始數組支持的,所以它不能改變大小。 -
轉換為
ArrayList
:通過將這個固定大小的列表作為參數傳遞給ArrayList
的構造函數,你創建了一個新的ArrayList
。這個新的ArrayList
是完全獨立的,它在內部復制了所有元素,因此修改它不會影響原始數組。 -
操作列表:現在,你可以自由地添加或刪除列表中的元素,就像操作任何標準的
ArrayList
那樣。
這種方法簡單且有效,特別適合需要從數組轉換來的數據進行多次和復雜的列表操作時使用。