Bloch中的toArray方法ArrayList同时使用System.arraycopy和Arrays.copyOf复制一个数组。
toArray
ArrayList
System.arraycopy
Arrays.copyOf
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; }
如何比较这两种复制方法,何时应使用哪种复制方法?
同之处在于Arrays.copyOf不仅复制元素,还创建新的数组。System.arraycopy复制到现有阵列中。
这是的来源Arrays.copyOf,你可以看到它在System.arraycopy内部用于填充新数组:
Arrays.copyO
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }