首先,要先明确的是集合(ArayyList)的长度可增长和可变长度数组的原理,都是新建一个新长度的数组,然后把旧的引用指向新的数组。
然后我们来分析下以上代码: Arrays.asList(a); 我们查看API发现该方法的说明是:static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表。
也就是说通过这个方法返回的集合长度是固定的不可变的,所以不能再添加。
那为什么通过这个方法返回的这个集合长度不可变,而其它集合长度可变呢?那我们只能查看原代码了。通过查看原代码发现,该方法的原代码如下:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
},于是我们只能再进一步去查看, ArrayList<>(a);这个构造方法的原代码了,这个构造方法的原代码如下:
private final E[] a
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}通过以上代码你就可以看出list底层返回的其实是一个和String[] a一样长度的数组了,也就可以明白为什么是不能再往里添加元素了
至于可变长度数组和集合的实现方法,楼主有兴趣的话可以自己去看下原代码哦,至于该list集合和a数组的关系通过以上原代码 就不用说了吧{:soso_e113:}