从Java 5 中的 ArrayList开始,如果数组具有正确的大小(或更大),它将已经被填充。最后
MyClass[] arr = myList.toArray(new MyClass[myList.size()]);
将创建一个数组对象,填充它并将其返回给“arr”。另一方面
MyClass[] arr = myList.toArray(new MyClass[0]);
将创建两个数组。第二个是长度为 0 的 MyClass 数组。因此,会为将立即丢弃的对象创建对象。就源代码而言,编译器/JIT 无法优化这个,因此它不会被创建。此外,使用零长度对象会导致在 toArray() - 方法中进行强制转换。
查看 ArrayList.toArray() 的来源:
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
使用第一种方法,以便只创建一个对象并避免(隐式但昂贵的)强制转换。