成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Arrays.asList()得到的是真的ArrayList?操作修改集合大坑

開發 前端
使用工具類 Arrays.asList() 把數組轉換成集合時,不能使用其修改集合相關的方法,它的 add / remove / clear 方法會拋出 UnsupportedOperationException 異常。

一、前言

今天在看阿里Java規范的時候看到一條規范,經常使用,卻一直沒有注意的一條!

相信大家應該踩過這個坑,下面來看一看阿里規范里的內容:

【強制】使用工具類 Arrays.asList() 把數組轉換成集合時,不能使用其修改集合相關的方法,它的 add / remove / clear 方法會拋出 UnsupportedOperationException 異常。

『說明』:asList 的返回對象是一個 Arrays 內部類,并沒有實現集合的修改方法。

Arrays.asList 體現的是適配器模式,只是轉換接口,「后臺的數據仍是數組」。

String[] str = new String[]{ "yang", "guan", "bao" };
List list = Arrays.asList(str);

第一種情況:list.add("yangguanbao"); 運行時異常。

第二種情況:str[0] = "change"; list 中的元素也會隨之修改,反之亦然。

想要最新版Java開發手冊(黃山版)的可以自行下載一下:

黃山版(2022.2.3發布)下載鏈接:https://github.com/alibaba/p3c

還請點個微信公眾號關注哈!

下面我們來從例子和源碼來詳細看一下是不是如此??!

二、例子測試

1、添加元素

String[] arr = {"Hello", "World"};
List<String> stringList = Arrays.asList(arr);

stringList.add("報錯了!");

System.out.println(stringList);

我們看到如文檔所說,報了UnsupportedOperationException異常,UnsupportedOperationException是Java編程語言中的一個異常,它表示不支持當前操作或方法。當程序嘗試執行某個操作或調用某個方法,而該操作或方法不被支持時,就會拋出此異常。

圖片

2、修改數組

String[] arr = {"Hello", "World"};
List<String> stringList = Arrays.asList(arr);

arr[0] = "修改了呢";
System.out.println(stringList);

我們可以看到,集合隨著數組的變化而變化!

原因是這樣的:

Arrays.asList()方法返回的集合是基于原始數組的,也就是說,它不會創建一個新的集合對象,而是將原始數組作為集合的底層實現。因此,當您更改原始數組時,通過Arrays.asList()方法得到的集合元素也會隨之改變。

圖片

3、提醒

基本數據類型要使用包裝類型,不然會有問題!

int[] ints = {1,2};
List<int[]> ints1 = Arrays.asList(ints);
for (int[] ints2 : ints1) {
    System.out.println(ints2);
}
System.out.println(ints1.size());

我們可以看到集合的數量為1,這是什么原因呢?

原因是:

由于Java中的泛型不支持基本類型,所以它會將整個數組視為單個元素添加到列表中。

圖片

三、源碼查看究竟

看了一下源碼明明new了一個ArrayList:

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

為什么不能操作修改集合呢?

我們在點進去這個ArrayList構造方法,你會發現,這個ArrayList非ArrayList!

是不是有點懵逼,我們先看一下這倆個的UML圖:

圖片

這個ArrayList是Arrays類的一個內部類,繼承了AbstractList<E>類,但是只重寫了一些方法,沒有重寫add、remove、clear等操作集合的方法!所以會出現UnsupportedOperationException異常!

再看一下源碼:

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
    }

明明有ArrayList為什么還要寫一個內部類呢?

主要是為了提高代碼的效率和簡潔性。由于 Arrays.asList() 返回的 List 對象是一個視圖,它只是一個包裝了原始數組的列表,并不需要額外的空間來存儲元素。因此,通過 Arrays.asList() 方法將一個數組轉換成 List 可以避免創建一個新的 ArrayList 對象,從而提高代碼的效率和簡潔性。

四、總結

我們從阿里開發手冊中知道了Arrays.asList()的注意事項,自己進一步的通過例子來進行實踐,最后通過源碼角度來知道Arrays.asList()的原理!

我們知道了:

使用工具類 Arrays.asList() 把數組轉換成集合時,不能使用其修改集合相關的方法,它的 add / remove / clear 方法會拋出 UnsupportedOperationException 異常。

更改原始數組時,通過Arrays.asList()方法得到的集合元素也會隨之改變。

由于Java中的泛型不支持基本類型,所以它會將整個數組視為單個元素添加到列表中。

知道 Arrays.asList() 的返回值是ArrayList,它是Arrays類的一個內部類,為了提高代碼的效率和簡潔性。

以后使用就要注意這些問題!

責任編輯:姜華 來源: 小王博客基地
相關推薦

2024-04-11 09:17:51

ArraysJava安全

2023-11-07 08:14:41

List.of()Java

2024-04-02 08:41:10

ArrayListSubList場景

2023-10-16 08:04:12

List.of()?Java集合

2024-11-13 11:40:37

2024-02-22 08:59:41

JavaArrayListLinkedList

2023-06-30 08:10:14

JavaBigDecimal

2024-09-10 12:15:24

2018-07-06 15:04:24

緩存token線程

2013-12-03 10:25:59

平臺O2O地圖行業

2020-12-24 06:00:27

Python編程語言開發

2018-06-08 11:29:52

戴爾

2010-08-19 09:48:41

Unix

2012-03-19 09:57:09

JavaArrayList

2013-10-25 09:58:54

開發者操作系統

2015-10-29 09:36:31

高端編程語言

2021-12-15 23:07:53

元宇宙VR平行時空

2024-07-26 15:58:55

2021-08-19 10:30:13

Java集合排序程序開發

2023-12-01 11:13:50

JavaTreeSet
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.狠狠干 | 亚洲va在线va天堂va狼色在线 | 国产精品亚洲精品 | 99精品国自产在线观看 | 国产不卡一区 | 日韩久久综合网 | 久久精品福利 | 亚洲日日操 | 欧美中文字幕一区二区三区亚洲 | 亚洲3级| 青青草精品| 国产一区二区三区久久久久久久久 | av网站免费| 91精品久久久久久久久 | 久久激情五月丁香伊人 | 久久午夜视频 | 久久久久久精 | 成年免费大片黄在线观看岛国 | av毛片| 热久久免费视频 | 欧美亚洲一区二区三区 | 欧美一区二区三区久久精品 | 午夜成人免费电影 | 国产成人精品在线 | 日韩精品一区二区三区中文字幕 | 亚洲综合精品 | 久色| 国产精品欧美一区二区三区 | 春色av| 中文字幕在线观看日韩 | 九九综合 | 日本成人在线观看网站 | 亚洲a视频 | 亚洲永久 | 亚洲成人福利在线观看 | 91在线精品一区二区 | 久久在视频 | 97在线观视频免费观看 | 日本特黄a级高清免费大片 成年人黄色小视频 | 久久新| 国产精品一区二区福利视频 |