Arrays.asList():使用指南

来源:https://www.cnblogs.com/waynaqua/archive/2023/09/19/17715382.html
-Advertisement-
Play Games

Arrays.asList() 是一個 Java 的靜態方法,它可以把一個數組或者多個參數轉換成一個 List 集合。這個方法可以作為數組和集合之間的橋梁,方便我們使用集合的一些方法和特性。本文將介紹 Arrays.asList() 的語法、應用場景、坑點和總結。 語法 應用場景 坑點 總結 語法 ...


Arrays.asList() 是一個 Java 的靜態方法,它可以把一個數組或者多個參數轉換成一個 List 集合。這個方法可以作為數組和集合之間的橋梁,方便我們使用集合的一些方法和特性。本文將介紹 Arrays.asList() 的語法、應用場景、坑點和總結。

  • 語法
  • 應用場景
  • 坑點
  • 總結

語法

Arrays.asList() 的語法格式如下:

public static <T> List<T> asList(T... a)

這個方法接受一個泛型參數 T,表示數組或者參數的類型。T 必須是一個引用類型,不能是一個基本類型,例如 int, double, char 等。如果傳入一個基本類型的數組,Arrays.asList() 會把它當作一個 Object 類型的元素,而不是把它的每個元素當作 Object 類型。這樣就會導致返回的 List 只有一個元素,就是原始數組本身。

Arrays.asList() 返回的 List 是一個 Arrays 類的內部類,它持有一個對原始數組的引用。這意味著對 List 的修改會反映到數組上,反之亦然。但是,這個 List 的大小是固定的,不能進行增加或者刪除的操作,否則會拋出 UnsupportedOperationException 異常。

Arrays.asList() 返回的 List 是可序列化的,並且實現了 RandomAccess 介面,表示它支持隨機訪問。

應用場景

Arrays.asList() 可以用在以下幾種場景中:

  • 當我們需要創建一個不需要改變大小或者內容的 List 集合時,我們可以使用 Arrays.asList() 來快速地初始化一些元素。例如:
// 使用 Arrays.asList() 創建一個不可變的 List
List<String> list = Arrays.asList("a", "b", "c");
System.out.println(list); // [a, b, c]
  • 當我們需要創建一個空的或者單元素的 List 集合時,我們可以使用 Arrays.asList() 來簡化代碼。例如:
// 使用 Arrays.asList() 創建一個不可變的空 List
List<String> emptyList = Arrays.asList();
System.out.println(emptyList); // []

// 使用 Arrays.asList() 創建一個不可變的單元素 List
List<String> singletonList = Arrays.asList("a");
System.out.println(singletonList); // [a]
  • 當我們需要從一個數組或者其他集合類創建一個不可變的 List 集合時,我們可以使用 Arrays.asList() 來方便地轉換。例如:
// 使用 Arrays.asList() 從數組創建一個不可變的 List
String[] array = {"a", "b", "c"};
List<String> listFromArray = Arrays.asList(array);
System.out.println(listFromArray); // [a, b, c]

// 使用 Arrays.asList() 從其他集合類創建一個不可變的 List
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
List<String> listFromSet = Arrays.asList(set.toArray(new String[0]));
System.out.println(listFromSet); // [a, b, c]
  • 當我們需要使用一些集合類的方法或者特性時,我們可以使用 Arrays.asList() 來把數組轉換成集合。例如:
// 使用 Arrays.asList() 把數組轉換成集合,並使用 Collections 類的方法
String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);
Collections.sort(list); // 對集合進行排序
System.out.println(list); // [a, b, c]
Collections.reverse(list); // 對集合進行反轉
System.out.println(list); // [c, b, a]
Collections.shuffle(list); // 對集合進行隨機打亂
System.out.println(list); // [b, a, c] 或者其他隨機順序

// 使用 Arrays.asList() 把數組轉換成集合,並使用 Stream API
String[] array = {"a", "b", "c"};
List<String> list = Arrays.asList(array);
list.stream().forEach(System.out::println); // 對集合進行遍歷並列印每個元素
list.stream().map(String::toUpperCase).forEach(System.out::println); // 對集合進行映射並列印每個元素的大寫形式
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println); // 對集合進行過濾並列印以 a 開頭的元素

坑點

Arrays.asList() 也有一些坑點,需要註意以下幾點:

  • Arrays.asList() 不支持基本數據類型的數組,因為它只能接受 Object 類型的參數或者數組。基本數據類型(如 int, double, char 等)不是 Object 的子類,所以不能直接作為 Arrays.asList() 的參數。如果傳入一個基本數據類型的數組,Arrays.asList() 會把它當作一個 Object 類型的元素,而不是把它的每個元素當作 Object 類型。這樣就會導致返回的 List 只有一個元素,就是原始數組本身。

如果想要把一個基本數據類型的數組轉換成 List,有以下幾種方法:

  • 使用迴圈遍曆數組,並把每個元素添加到 List 中。這樣可以利用自動裝箱(autoboxing)的特性,把基本數據類型轉換成對應的包裝類(如 Integer, Double, Character 等)。
  • 使用 Java 8 中的 Stream API,可以用一行代碼實現數組到 List 的轉換。可以使用 Arrays.stream() 或者 IntStream.of() 等方法,然後調用 boxed() 和 collect() 方法。
  • 使用第三方庫,如 Guava 或者 Apache Commons Lang,它們提供了一些工具類和方法來處理基本數據類型的數組和集合。

示例代碼如下:

// 使用迴圈遍曆數組,並把每個元素添加到 List 中
int[] array = {1, 2, 3};
List<Integer> list = new ArrayList<>();
for (int num : array) {
    list.add(num); // 利用自動裝箱
}
System.out.println(list); // [1, 2, 3]

// 使用 Stream API 實現數組到 List 的轉換
int[] array = {1, 2, 3};
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]

// 使用 Guava 實現數組到 List 的轉換
int[] array = {1, 2, 3};
List<Integer> list = Ints.asList(array);
System.out.println(list); // [1, 2, 3]
  • Arrays.asList() 返回的 List 是不可變的,也就是說,不能對它進行增加或者刪除的操作,否則會拋出 UnsupportedOperationException 異常。這是因為 Arrays.asList() 返回的 List 是一個 Arrays 類的內部類,它沒有實現 add() 和 remove() 等方法。

如果想要創建一個可變的 List 集合,有以下幾種方法:

  • 使用 ArrayList 的構造器,並把 Arrays.asList() 作為參數傳入。這樣可以創建一個新的 ArrayList 對象,並複製原始數組中的元素。例如:
// 使用 ArrayList 的構造器創建一個可變的 List
String[] array = {"a", "b", "c"};
List<String> list = new ArrayList<>(Arrays.asList(array));
System.out.println(list); // [a, b, c]
list.add("d"); // 可以增加元素
System.out.println(list); // [a, b, c, d]
  • 使用 Java 8 中的 Stream API,可以用一行代碼實現數組到 List 的轉換。可以使用 Arrays.stream() 或者 IntStream.of() 等方法,然後調用 collect() 方法。例如:
// 使用 Stream API 實現數組到 List 的轉換
int[] array = {1, 2, 3};
List<Integer> list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]
list.add(4); // 可以增加元素
System.out.println(list); // [1, 2, 3, 4]

總結

Arrays.asList() 是一個簡單而有用的方法,它可以幫助我們把數組轉換成 List 集合。但是它也有一些限制和註意事項,我們應該根據具體的需求和場景來選擇合適的方法。希望這篇文章對你有所幫助,謝謝您的閱讀。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、定義 將一個類的介面轉換成客戶希望的另一個介面。適配器模式讓那些介面不相容的類可以一起工作。適配器模式是一種結構型模式。 二、描述 包含以下三個角色: 1、Target(目標抽象類):目標抽象類定義了客戶所需要的介面,可以是一個抽象類或介面,也可以是一個具體的類,由於C#不支持多繼承,所以它只能 ...
  • 前言 個人網站使用Vue作為前端,SpringBoot作為後端,MySQL作為資料庫,但前端每次請求都會從MySQL資料庫中讀取數據,而MySQL資料庫的數據是存儲於伺服器磁碟中,所以響應速度有一定影響。之前瞭解過一點Redis資料庫,該資料庫數據存儲於記憶體中(也可以持久化於磁碟中),數據讀取速度就 ...
  • 早上看到一篇關於Spring Boot虛擬線程和Webflux性能對比的文章,覺得還不錯。內容較長,我就不翻譯了,抓重點給大家介紹一下這篇文章的核心內容,方便大家快速閱讀。 測試場景 作者採用了一個儘可能貼近現實操作的場景: 從授權頭信息中提取JWT 驗證JWT並從中提取用戶的Email 使用用戶的 ...
  • 你可能會為不同版本的工具鏈而煩惱,就算是 ruster 也一樣。介紹一個非常好用的管理工具給大伙,就是使用 Rustup 安裝和更新 Rust 工具鏈。安裝 Rustup 之後,可以在 stable, beta,和 nightly 等版本的 Rust 編譯器工具之間無縫切換。 ...
  • MyBatis中#{}和${}的用法 說一下為什麼要寫這篇文章,最近面試有被問到,一下子想不出來有啥區別,想記錄一下加深自己的理解,同時自己也經常用MyBatis-Plus忽略了XML文件的編寫和使用,所以需要加深一下這塊的知識 一、例子 1、#{}將傳入的數據當作一個字元串,會對傳入的數據加上一個 ...
  • Caffeine Cache以其高性能和可擴展性贏得 本地緩存之王 的稱號,它是一個Java緩存庫。它的設計目標是優化計算速度、記憶體效率和實用性,以符合現代軟體開發者的需求。 ...
  • C++和Rust通過wasmtime實現相互調用實例 1 wasmtime介紹 wasmtime是一個可以運行WebAssembly代碼的運行時環境。 WebAssembly是一種可移植的二進位指令集格式,其本身與平臺無關,類似於Java的class文件位元組碼。 WebAssembly本來的設計初衷 ...
  • 哈嘍大家好,我是鹹魚 當談到編程效率和性能優化時,Python 常常被調侃為“慢如蝸牛” 有趣的是,Python 代碼在函數中運行往往比在全局範圍內運行要快得多 小伙伴們可能會有這個疑問:為什麼在函數中運行的 Python 代碼速度更快? 今天這篇文章將會解答大家心中的疑惑 原文鏈接:https:/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...