java Arrays.asList 返回什么與普通 ArrayList 區(qū)別介紹
核心結(jié)論
- 它返回什么?
Arrays.asList()返回一個由指定數(shù)組支持的、固定大小的List視圖。 - 有區(qū)別嗎? 有巨大區(qū)別。它返回的不是我們常用的
java.util.ArrayList,而是一個內(nèi)部自定義的、行為受限的類。
詳細區(qū)別與解釋
我們可以通過一個表格和代碼示例來清晰地對比:
| 特性 | Arrays.asList(...) 返回的列表 | new ArrayList<>() |
|---|---|---|
| 所屬類 | 一個私有的、內(nèi)部的 Arrays$ArrayList 類 | java.util.ArrayList |
| 數(shù)據(jù)結(jié)構(gòu) | 基于原始數(shù)組的一個“視圖”(View) | 基于可動態(tài)擴容的數(shù)組 |
| 大小是否可變 | 固定大?。‵ixed-size) | 可變大?。≧esizable) |
| 支持添加元素 | 否。調(diào)用 add() 會拋出 UnsupportedOperationException | 是 |
| 支持刪除元素 | 否。調(diào)用 remove() 會拋出 UnsupportedOperationException | 是 |
| 支持修改元素 | 是。set(index, element) 方法可用 | 是 |
| 與原數(shù)組的關(guān)系 | 共享底層數(shù)據(jù)。修改列表元素等于修改原數(shù)組 | 完全獨立。創(chuàng)建時拷貝元素,與原數(shù)組無關(guān) |
代碼示例
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// 1. 創(chuàng)建一個原始數(shù)組
String[] originalArray = {"A", "B", "C"};
// 2. 使用 Arrays.asList 得到一個 List
List<String> asList = Arrays.asList(originalArray);
System.out.println("asList: " + asList); // 輸出: [A, B, C]
// 3. 創(chuàng)建一個普通的 ArrayList
List<String> realArrayList = new ArrayList<>(Arrays.asList(originalArray));
System.out.println("realArrayList: " + realArrayList); // 輸出: [A, B, C]
// --- 測試修改元素 (兩者都支持) ---
asList.set(0, "A_Modified");
realArrayList.set(0, "A_Modified");
System.out.println("After set(0):");
System.out.println("asList: " + asList); // 輸出: [A_Modified, B, C]
System.out.println("realArrayList: " + realArrayList); // 輸出: [A_Modified, B, C]
System.out.println("originalArray: " + Arrays.toString(originalArray));
// 關(guān)鍵!原數(shù)組也被修改了: [A_Modified, B, C]
// 這說明 asList 和 originalArray 共享底層數(shù)據(jù)
// --- 測試添加元素 (關(guān)鍵區(qū)別) ---
try {
realArrayList.add("D"); // 成功
System.out.println("realArrayList after add: " + realArrayList); // [A_Modified, B, C, D]
} catch (Exception e) {
System.out.println("realArrayList add failed: " + e);
}
try {
asList.add("D"); // 失敗!拋出異常
} catch (Exception e) {
System.out.println("asList add failed: " + e);
// 輸出: java.lang.UnsupportedOperationException
}
// --- 測試刪除元素 (關(guān)鍵區(qū)別) ---
try {
realArrayList.remove(0); // 成功
System.out.println("realArrayList after remove: " + realArrayList); // [B, C, D]
} catch (Exception e) {
System.out.println("realArrayList remove failed: " + e);
}
try {
asList.remove(0); // 失敗!拋出異常
} catch (Exception e) {
System.out.println("asList remove failed: " + e);
// 輸出: java.lang.UnsupportedOperationException
}
}
}為什么會這樣設(shè)計?
Arrays.asList() 的設(shè)計目的不是為了創(chuàng)建一個全能、可變的集合,而是為了提供一個在數(shù)組和期望接收 List 參數(shù)的API之間進行轉(zhuǎn)換的橋梁。
它的主要用途是:
- 當(dāng)你需要一個快速、輕量級的列表視圖來遍歷或訪問數(shù)組元素時。
- 當(dāng)一個方法需要傳入
List參數(shù),而你手頭正好有一個數(shù)組時,可以快速包裝一下。例如:someMethodThatTakesList(Arrays.asList(myArray))。
如何得到一個真正可變的ArrayList?
如果你需要的是一個可以隨意添加、刪除元素的完整功能的 ArrayList,你應(yīng)該新建一個:
String[] myArray = {“A”, “B”, “C”};
// 方法一:最常用和推薦的方法
List list1 = new ArrayList<>(Arrays.asList(myArray));
// 方法二:使用 Java 8 的 Stream API (更現(xiàn)代)
List list2 = Arrays.stream(myArray).collect(Collectors.toList());
// 方法三:如果你需要的是特定類型的ArrayList,而不是通用的List接口
ArrayList list3 = new ArrayList<>(Arrays.asList(myArray));
總結(jié):
記住 Arrays.asList() 返回的是一個尺寸固定的“假”列表,它只是原始數(shù)組的一個只讀視圖(除了修改元素值)。在絕大多數(shù)需要操作集合內(nèi)容的場景下,你都應(yīng)該將它作為構(gòu)造參數(shù),創(chuàng)建一個真正的 java.util.ArrayList。
到此這篇關(guān)于java Arrays.asList 返回什么與普通 ArrayList 區(qū)別介紹的文章就介紹到這了,更多相關(guān)java Arrays.asList與ArrayList 區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實例
這篇文章主要介紹了Java8 使用工廠方法supplyAsync創(chuàng)建CompletableFuture實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring @Async 注解異步調(diào)用失效的五種解決方案
加上了@Async 注解,期待它能異步執(zhí)行,結(jié)果發(fā)現(xiàn)它還是同步執(zhí)行的?更困惑的是,同樣的注解在其他地方卻能正常工作,這個問題困擾了很多 Java 開發(fā)者,尤其是當(dāng)你在同一個類中調(diào)用帶有@Async 注解的方法時,今天,我們就來深入解析這個問題的原因,并提供多種實用的解決方案2025-05-05
IDEA使用SpringAssistant插件創(chuàng)建SpringCloud項目
IDEA 功能強大,可以用來高效的開發(fā)應(yīng)該程序。它還支持第三方插件、用戶可以根據(jù)需要添加自己喜歡的插件。下面介紹如何使用 IDEA 創(chuàng)建 Spring Cloud 項目2021-06-06
詳解Java ES多節(jié)點任務(wù)的高效分發(fā)與收集實現(xiàn)
ElasticSearch 是一個高可用開源全文檢索和分析組件。提供存儲服務(wù),搜索服務(wù),大數(shù)據(jù)準(zhǔn)實時分析等。一般用于提供一些提供復(fù)雜搜索的應(yīng)用2021-06-06
SpringBoot 自定義+動態(tài)切換數(shù)據(jù)源教程
這篇文章主要介紹了SpringBoot 自定義+動態(tài)切換數(shù)據(jù)源教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12

