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

欢迎关注:阿清的日常

留言互相讨论或者留言。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值