集合源码解读----addAll方法

本文讨论了在Java中初始化List的多种方法,特别是使用addAll方法的灵活性与限制。通过对比不同参数类型的影响,如Collection与数组,揭示了泛型在类型安全上的作用。作者提出了直接使用数组作为参数的addAll方法的可能性,并通过实验验证了其可行性,但同时也指出了可能引入的类型不一致问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在多次写测试demo时,在初始化List时,总是很麻烦,需要多次调用add方法,

List是提供 addAll(Collection<? extends E> c)方法的,其实现是将集合c转为Object[],再调用arrayCopy

public boolean addAll(Collection<? extends E> c) {
    Object[] a = c.toArray();
    int numNew = a.length;
    ensureCapacityInternal(size + numNew); // Increments modCount
    System.arraycopy(a, 0, elementData, size, numNew);
    size += numNew;
    return numNew != 0;
}

那为什么不提供一个参数为数组的方法,addAll()方法,参数为数组呢,这样初始化List内部数据时写起来就很快。

那么尝试一下,假如这样写

public boolean addAll(Object[] a) {
   int numNew = a.length;
   ensureCapacityInternal(size + numNew); // Increments modCount
   System.arraycopy(a, 0, elementData, size, numNew);
   size += numNew;
   return numNew != 0;
}

经测试,

public static void main(String[] args) {
    MyList<Integer> m = new MyList();
    Object[] objects = {1,3,5,6,"ss"};
    m.addAll(objects);
    System.out.println(m);
}

输出结果为  [1, 3, 5, 6, ss],这就存在很明显的问题了,集合中混入了String类型。

假如参数类型为E[] ,经测试

public boolean addAll(E[] a) {
   int numNew = a.length;
   ensureCapacityInternal(size + numNew); // Increments modCount
   System.arraycopy(a, 0, elementData, size, numNew);
   size += numNew;
   return numNew != 0;
}

理论上似乎是可以的,测试结果也并没有什么问题。暂时也没想到可能会导致什么坑,

所以,我认为这应该是可行的。

欢迎大佬指正!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值