从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;
}
使用第一种方法,以便仅创建一个对象,并避免(隐式但仍然很昂贵)强制转换。