在多次写测试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;
}
理论上似乎是可以的,测试结果也并没有什么问题。暂时也没想到可能会导致什么坑,
所以,我认为这应该是可行的。
欢迎大佬指正!
本文讨论了在Java中初始化List的多种方法,特别是使用addAll方法的灵活性与限制。通过对比不同参数类型的影响,如Collection与数组,揭示了泛型在类型安全上的作用。作者提出了直接使用数组作为参数的addAll方法的可能性,并通过实验验证了其可行性,但同时也指出了可能引入的类型不一致问题。
2208

被折叠的 条评论
为什么被折叠?



