在多次写测试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;}
理论上似乎是可以的,测试结果也并没有什么问题。暂时也没想到可能会导致什么坑,
所以,我认为这应该是可行的。
欢迎大佬指正!