黑马程序员技术交流社区

标题: 关于数组转集合,为何不能添加元素 [打印本页]

作者: chengaq0    时间: 2015-10-24 18:05
标题: 关于数组转集合,为何不能添加元素
List list = Arrays.asList(数组);      //此方法转换成的集合,为何调用add()方法会报错,是如何限制该数组转换成的集合不能添加元素呢,jvm运行的时候是如何知道这个集合是转换过来的。有没有知道的

作者: 会盟天下英豪    时间: 2015-10-24 18:06
1.ArrayS源码:
public class Arrays
{
            .....
         //数组转集合
         public static <T> List<T> asList(T... a)
           {
                return new ArrayList<>(a);
           }
         //内部类
          private static class ArrayList<E> extends AbstractList<E>
             implements RandomAccess, java.io.Serializable
     {
                 内部没有add()方法。
     }
   ....
}
2.AbstractList源码:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
{
    public boolean add(E e) {
        add(size(), e);
        return true;
    }
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
}
3.ArratList源码
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{.......
     add(E E)...
........
}

4.Arrays类内定义了ArrayList内部类,该内部类并没有实现List接口,add方法继承自AbstractList,AbstractList类内的add方法会抛异常。反观ArrayList源码,虽继承了AbstractList,也同时实现了List接口。

作者: 孤单背影    时间: 2015-10-24 19:27
这个问题不错,老师讲的时候我们只是记住了。有谁知道为什么
作者: 任珅    时间: 2015-10-24 19:27
这个方法转换来的集合的长度是数组的固定长度,无法更改长度的
作者: chengaq0    时间: 2015-10-24 23:01
任珅 发表于 2015-10-24 19:27
这个方法转换来的集合的长度是数组的固定长度,无法更改长度的

从概念上讲是无法更改,但在内部是如何判断的,源代码上有体现吗,通过asList()方法得到的List集合是有长度限制的,转换的时候是如何限制的
作者: 刘彦宗    时间: 2015-10-25 00:08
因为就是将数组转换为集合,但其本质还是一个数组。估计只能改变展现形式,但其在内存中的存储形式不能够改变。
作者: chengaq0    时间: 2015-10-25 07:18
刘彦宗 发表于 2015-10-25 00:08
因为就是将数组转换为集合,但其本质还是一个数组。估计只能改变展现形式,但其在内存中的存储形式不能够改 ...

ArrayList底层操作的就是数组,我知道是怎么限制的了
作者: xingjiyuan26    时间: 2015-10-26 15:58
楼上解决的不错,此ArrayList非彼ArrayList
作者: 会盟天下英豪    时间: 2015-10-28 14:37
会盟天下英豪 发表于 2015-10-24 18:06
1.ArrayS源码:
public class Arrays
{

这种方式可以创建一个真正的ArrayList类:(ArrayList的构造方法可以接受一个集合类型)
ArrayList al=new ArrayList(Arrays.asList(arr));


作者: xiaojunru    时间: 2015-12-6 23:56
来晚了,被解决了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2