目录
入坑
@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并分享出来。
欢迎关注:阿清的日常。
留言互相讨论或者留言。