1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 集合源码解读----addAll方法

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

时间:2021-07-03 14:03:15

相关推荐

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

在多次写测试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 modCountSystem.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 modCountSystem.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 modCountSystem.arraycopy(a, 0, elementData, size, numNew);size += numNew;return numNew != 0;}

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

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

欢迎大佬指正!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。