List你可能沒遇到的坑!

目錄

 

 

入坑

解惑

真相大白

意外發現

總結


 

入坑

    @Test
    public void test() {
        String[] str = new String[]{"1", "2", "3", "4"};
        List<String> strList = Arrays.asList(str);
        strList.add("testAdd");
        System.out.println(strList.toString());
    }

 

上述代碼編譯時沒有異常,但是運行時會報沒有這個方法的錯:

 

解惑

 

當我們進入源碼查看時:

返回的類型也是ArrayList,怎麼沒有add()方法呢

這時我們查看new ArrayList()的源碼

我們可以看到ArrayList中有add()方法;這時我們再次查看Arrays.asList()方法

發現ArrayList只是Arrays的一個內部類,並不是java.util包下的ArrayList,我們看一下Arrays的ArrayList源碼:

這個內部類繼承了AbstractList類,上面我們可以看到,這個內部類並沒有重寫add方法。

 

真相大白

 

原來只是名稱相同,但是都繼承了AbstractList類,所以方法都可以通過編譯。

 

意外發現

 

先看代碼

    @Test
    public void test() {
        String[] str = new String[]{"1", "2", "3", "4"};
        List<String> strList = Arrays.asList(str);
        //strList.add("testAdd");
        System.out.println(strList.toString());
        str[1] = "update_2";
        System.out.println("str:"+Arrays.toString(str));
        System.out.println("strList:" + strList);
    }

​​​​​​

當我們修改str數組時,發現strList也被修改,如果應用在真實場景,難免會頭疼一會,接下來查看源碼:

 

靜態內部類中有一個構造方法,構造方法每次都傳入了之前的數組,所以原數組修改,生成的ArrayList也會被修改

解決:

我們可以使用new ArrayList()嵌套

String[] str = new String[]{"1", "2", "3", "4"};
List<String> strList = Arrays.asList(str);
List<String> newList = new ArrayList<>(strList);

總結

遇事不要慌,debug走一遍,源碼大概瀏覽一下,後續會記錄更多的bug並分享出來。

歡迎關注:阿清的日常

留言互相討論或者留言。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章