日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Arrays.asList()得到的是真的ArrayList?操作修改集合大坑

一、前言

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

為淮北等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及淮北網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、成都做網(wǎng)站、淮北網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

相信大家應(yīng)該踩過這個坑,下面來看一看阿里規(guī)范里的內(nèi)容:

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

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

Arrays.asList 體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,「后臺的數(shù)據(jù)仍是數(shù)組」。

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

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

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

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

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

還請點個微信公眾號關(guān)注哈!

下面我們來從例子和源碼來詳細(xì)看一下是不是如此?。?/p>

二、例子測試

1、添加元素

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

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

System.out.println(stringList);

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

2、修改數(shù)組

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

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

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

原因是這樣的:

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

3、提醒

基本數(shù)據(jù)類型要使用包裝類型,不然會有問題!

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

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

原因是:

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

三、源碼查看究竟

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

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

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

我們在點進去這個ArrayList構(gòu)造方法,你會發(fā)現(xiàn),這個ArrayList非ArrayList!

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

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

再看一下源碼:

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

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

明明有ArrayList為什么還要寫一個內(nèi)部類呢?

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

四、總結(jié)

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

我們知道了:

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

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

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

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

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


當(dāng)前標(biāo)題:Arrays.asList()得到的是真的ArrayList?操作修改集合大坑
網(wǎng)站URL:http://m.5511xx.com/article/dhcegod.html