在JDK 1.7中,ArrayList
使用asList
声明。
他们为什么要制作新的private static class
而不使用java.util.ArrayList
:
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
public int size() {
return a.length;
}
public Object[] toArray() {
return a.clone();
}
public <T> T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class<? extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
public E get(int index) {
return a[index];
}
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
public int indexOf(Object o) {
if (o==null) {
for (int i=0; i<a.length; i++)
if (a[i]==null)
return i;
} else {
for (int i=0; i<a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
public boolean contains(Object o) {
return indexOf(o) != -1;
}
}
答案 0 :(得分:25)
因为Arrays.asList()
返回的List
由支持给定的数组。它包裹了那个数组;对数组的更改将反映在List
中,反之亦然。
此外,因此,此处返回的List
具有固定大小。因此,它不能是ArrayList
,因为ArrayList
可以增长或缩小。
答案 1 :(得分:4)
因为默认ArrayList
没有ArrayList(E[] array)
构造函数。
答案 2 :(得分:3)
因为他们在提供的数组周围提供了一个List包装器,它是O(1),而不是从数组中的元素构建一个ArrayList,即O(n)。
这会导致您出现问题吗?如果是这样,可能是因为当你应该使用List
时,你将变量声明为ArrayList答案 3 :(得分:2)
声明asList(T... a)
方法返回由指定数组支持的固定大小列表,该列表也应该是可序列化的并实现RandomAccess
java.util.ArrayList
不符合此定义(固定大小),因此应使用其他类型的java.util.List
。
答案 4 :(得分:-1)
如果你使用ArrayList,快速从Table中检索数据,因为它是基于索引的, 在我们想要快速反复数据的地方,我们可以使用Arraylist ....
但是删除记录时ArrayList并不快,因为重新排列索引更复杂
如果我们想要更多删除记录,我们可以使用LinkedList,它不是基于索引的
ArrayList声明
的java.util.List
ArrayList arrayList = new ArrayList();