目錄
入坑
@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並分享出來。
歡迎關注:阿清的日常。
留言互相討論或者留言。