Java Arrays.copyOf 方法中 Object 数组的特殊处理详解
Java 的 Arrays.copyOf 方法用于创建数组副本。其源码中对 Object 数组的处理方式与其他类型数组不同,这并非巧合,而是出于性能优化的考虑。让我们深入分析其原因。
以下为 Arrays.copyOf 方法的源码片段:
public static <T> T[] copyOf(T[] original, int newLength, class<? extends T[]> newType) { @SuppressWarnings("unchecked") 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; }
立即学习“Java免费学习笔记(深入)”;
-
((Object) newType == (Object) Object[].class): 这段代码判断 newType 是否为 Object[] 类。
-
(T[]) new Object[newLength]: 如果 newType 是 Object[],则直接使用 new Object[newLength] 创建新的 Object 数组。
-
(T[]) Array.newInstance(newType.getComponentType(), newLength): 否则,使用 Array.newInstance 方法创建数组。
为什么不直接使用 Array.newInstance 创建所有类型的数组呢?
Array.newInstance 是一个本地方法,它依赖于反射机制创建数组,这会带来一定的性能开销。而对于 Object 数组,new Object[newLength] 是一种更直接、更高效的创建方式,避免了反射的开销。 这种优化策略在复制 Object 数组时尤为重要,因为它能显著提升效率。 直接使用 new Object[newLength] 的速度明显快于调用 Array.newInstance,后者需要经过本地方法调用和反射机制,这会产生额外的性能损耗。
因此,当可以确定 newType 为 Object[].class 时,选择直接创建 Object 数组是提高 Arrays.copyOf 方法性能的有效手段。