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并分享出来。

欢迎关注:阿清的日常

留言互相讨论或者留言。

 

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