ArrayList的初始化方式

14 篇文章 0 订阅
4 篇文章 0 订阅
本文探讨了为何将List<Long>传递给ArrayList构造方法时会报错,关键在于构造过程中的类型判断与数据复制。当传入的是ArrayList时,直接赋值;而SingletonList导致浅复制。结果分别解释为[1,2,3,4]和[[1,2,3,4]].
摘要由CSDN通过智能技术生成

问题

如下代码

List<Long> list=new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(3L);
list.add(4L);

List<List<Long>> ll=new ArrayList<>(list);
List<List<Long>> ll_2=new ArrayList<>(Collections.singletonList(list));

ll和ll_2看上去并没有什么不同,甚至他们用的都是同一个构造方法。但是,第一行代码是报错的。因为返回值不匹配。
那么他的返回值是什么呢,大致是这样的

[1, 2, 3, 4]
[[1, 2, 3, 4]]

为什么

为什么会有这样的差距呢?翻看java源码,也就是他们共同的构造方法

/**
     * Constructs a list containing the elements of the specified
     * collection, in the order they are returned by the collection's
     * iterator.
     *
     * @param c the collection whose elements are to be placed into this list
     * @throws NullPointerException if the specified collection is null
     */
public ArrayList(Collection<? extends E> c) {
    Object[] a = c.toArray();
    if ((size = a.length) != 0) {
        if (c.getClass() == ArrayList.class) {
            elementData = a;
        } else {
            elementData = Arrays.copyOf(a, size, Object[].class);
        }
    } else {
        // replace with empty array.
        elementData = EMPTY_ELEMENTDATA;
    }
}

开始时我确实被共同的参数迷惑住了,都是Collection,为啥就不一样呢?

解决

其实中间有一段需要格外注意的代码

if (c.getClass() == ArrayList.class) {
    elementData = a;
} else {
    elementData = Arrays.copyOf(a, size, Object[].class);
}

就是这里,如果传入的参数是 ArrayList类型,则直接赋值。否则的话,是进行了数据的拷贝然后赋值。上面两行代码,一个传入的ArrayList,一个传入的SingletonList(一个静态内部类),所以最终的结果也就是不一样的了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值