A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chengaq0 中级黑马   /  2015-10-24 18:05  /  3935 人查看  /  12 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

1黑马币
List list = Arrays.asList(数组);      //此方法转换成的集合,为何调用add()方法会报错,是如何限制该数组转换成的集合不能添加元素呢,jvm运行的时候是如何知道这个集合是转换过来的。有没有知道的

最佳答案

查看完整内容

1.ArrayS源码: public class Arrays { ..... //数组转集合 public static List asList(T... a) { return new ArrayList(a); } //内部类 private static class ArrayList extends AbstractList implements RandomAccess, java.io.Serializable { 内部没有add()方法。 } .... } 2.AbstractL ...

12 个回复

倒序浏览
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接口。

点评

此楼说的对! 该ArrayList不是那个ArrayList.  发表于 2015-10-28 09:01
多谢,原来如此,明白了  发表于 2015-10-26 20:56
好评  发表于 2015-10-26 15:57
回复 使用道具 举报
这个问题不错,老师讲的时候我们只是记住了。有谁知道为什么
回复 使用道具 举报
这个方法转换来的集合的长度是数组的固定长度,无法更改长度的
回复 使用道具 举报
任珅 发表于 2015-10-24 19:27
这个方法转换来的集合的长度是数组的固定长度,无法更改长度的

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

ArrayList底层操作的就是数组,我知道是怎么限制的了
回复 使用道具 举报
楼上解决的不错,此ArrayList非彼ArrayList
回复 使用道具 举报
会盟天下英豪 发表于 2015-10-24 18:06
1.ArrayS源码:
public class Arrays
{

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

回复 使用道具 举报
来晚了,被解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马