為什么阿里規(guī)約手冊要求謹(jǐn)慎使用Arrays.asList方法

前言

在開發(fā)中,有時候會碰到把多個參數(shù),或者說把數(shù)組轉(zhuǎn)成List的需求,通常我們會使用 Arrays.asList()方法。但是該方法在使用的過程中,稍有不慎就會出現(xiàn)嚴(yán)重的異常。有如下代碼:

@Test
public void test() {
    List<String> list = Arrays.asList("a", "a", "2");
    System.out.println(list.size());

    list.add("blog.happyjava.cn");
    System.out.println(list.size());
}

運(yùn)行之后,出現(xiàn)了異常:

阿里Java規(guī)約中的強(qiáng)制性要求

在阿里Java規(guī)約中有強(qiáng)制性的要求:使用工具類 Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時,不能使用其修改集合相關(guān)的方法,它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。

阿里規(guī)約里已經(jīng)提示了asList返回的對象是Arrays的一個內(nèi)部類。那么這個內(nèi)部類,跟我們一般用到的List(如ArrayList)有什么不一樣之處呢,下面我們就來分析下。

Arrays.asList()源碼分析

通過IDEA查看該方法源碼,如下:

這里返回了一個ArrayList,看起來似乎沒什么問題,但是這個ArrayList跟我們常用的java.util.ArrayList不一樣。通過IDEA點(diǎn)擊跳轉(zhuǎn),可以看到該ArrayList是Arrays的一個內(nèi)部類。

該內(nèi)部類的源碼其實不多,通過IDEA的structure,我們可以看到它實現(xiàn)的方法如下:

可以看到,這里是沒有實現(xiàn)我們最常用的add方法的。

那么,調(diào)用add等方法的時候,UnsupportedOperationException 異常是哪里拋出來的呢?我們看它繼承的java.util.AbstractList類,該類的add方法如下:

public boolean add(E e) {
    add(size(), e);
    return true;
}

這里有一個重載的add方法,再點(diǎn)進(jìn)去查看:

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

可以看到,是這里拋出了UnsupportedOperationException。

總結(jié)

Arrays.asList()是開發(fā)中非常常用的方法,所以我們一定要了解其存在的坑點(diǎn)。如果把其返回的ArrayList當(dāng)做了我們常用的java.util.ArrayList,那么是很容易埋下生產(chǎn)隱患的。

寫在最后

歡迎大家加入粉絲交流群:963944895,群內(nèi)免費(fèi)分享Spring框架、Mybatis框架、SpringBoot框架、SpringMVC框架、SpringCloud微服務(wù)、Dubbo框架、Redis緩存、RabbitMq消息、JVM調(diào)優(yōu)、Tomcat容器、MySQL數(shù)據(jù)庫教學(xué)視頻及架構(gòu)學(xué)習(xí)思維導(dǎo)圖

比你優(yōu)秀的對手在學(xué)習(xí),你的仇人在磨刀,你的閨蜜在減肥,隔壁老王在練腰, 我們必須不斷學(xué)習(xí),否則我們將被學(xué)習(xí)者超越!

趁年輕,使勁拼,給未來的自己一個交代!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容