溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

為啥阿里巴巴開(kāi)發(fā)手冊(cè)明確說(shuō)明Arrays.asList()不能用其修改方法

發(fā)布時(shí)間:2020-07-14 04:11:21 來(lái)源:網(wǎng)絡(luò) 閱讀:283 作者:Java技術(shù)箭 欄目:編程語(yǔ)言

引語(yǔ)

阿里巴巴java開(kāi)發(fā)規(guī)范說(shuō)到使用工具類(lèi)Arrays.asList()方法把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法,它的add/remove/clear方法會(huì)拋出UnsupportedOperationException(),我們來(lái)看一下為什么會(huì)出現(xiàn)這種情況.

問(wèn)題分析

我們做個(gè)測(cè)試

為啥阿里巴巴開(kāi)發(fā)手冊(cè)明確說(shuō)明Arrays.asList()不能用其修改方法


被注釋的三行可以分別解開(kāi)注釋,運(yùn)行后確實(shí)出現(xiàn)了規(guī)約中所說(shuō)的異常.我們來(lái)看下Arrays.asList()做了什么操作.

為啥阿里巴巴開(kāi)發(fā)手冊(cè)明確說(shuō)明Arrays.asList()不能用其修改方法


看上去是個(gè)很正常的方法,然而實(shí)際上你點(diǎn)進(jìn)到ArrayList發(fā)現(xiàn),其實(shí)ArrayList并不是我們平時(shí)用的ArrayList.

為啥阿里巴巴開(kāi)發(fā)手冊(cè)明確說(shuō)明Arrays.asList()不能用其修改方法


而是Arrays里面的一個(gè)內(nèi)部類(lèi).而且這個(gè)內(nèi)部類(lèi)沒(méi)有add,clear,remove方法,所以拋出的異常其實(shí)來(lái)自于AbstractList.

為啥阿里巴巴開(kāi)發(fā)手冊(cè)明確說(shuō)明Arrays.asList()不能用其修改方法


點(diǎn)進(jìn)去就會(huì)發(fā)現(xiàn)拋出異常的地方,clear底層也會(huì)調(diào)用到remove所以也會(huì)拋出異常.

總結(jié)

1.Arrays.asList()不要亂用,底層其實(shí)還是數(shù)組;

2.如果使用了Arrays.asList()的話,最好不要使用其集合的操作方法;

3.List list = new ArrayList<>(Arrays.asList("a", "b", "c"))可以在外面這樣包一層真正的ArrayList(數(shù)組轉(zhuǎn)集合有很多方式,可以參考https://stackoverflow.com/questions/157944/create-arraylist-from-array).

歡迎工作一到五年的Java工程師朋友們加入我的個(gè)人粉絲群(Java架構(gòu)技術(shù)棧:728987924)群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)、高性能及分布式、Jvm性能調(diào)優(yōu)、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)

合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己,不要再用"沒(méi)有時(shí)間“來(lái)掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來(lái)的自己一個(gè)交代!


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI