arrays.copyof对非基本类型数组执行浅拷贝:仅复制引用,不创建新对象;新数组多出元素填null;严格按类型创建数组,不自动转型或装箱;不校验null或负长度,需调用方防护。

Arrays.copyOf 处理非基本类型数组(如 String[]、Object[]、自定义对象数组等)时,核心行为是浅拷贝 + 默认值填充 + 类型安全创建,不涉及对象本身的深度复制。
只复制引用,不复制对象
对非基本类型数组,copyOf 拷贝的是每个元素的引用地址,不是新创建对象实例。原数组和新数组中对应位置指向的是同一个对象。
- 修改新数组某元素的字段(如
copy[0].setName("new")),原数组同位置对象也会变化 - 但给新数组某个索引重新赋值(如
copy[0] = new Person()),不影响原数组
新长度大于原长时,空位填 null
当 newLength > original.length,多出的元素位置统一填充为 null(这是所有引用类型的默认值)。
例如:
String[] src = {"a", "b"};String[] dst = Arrays.copyOf(src, 4);
// 结果:{"a", "b", null, null}
类型创建严格,支持泛型擦除下的安全转换
底层通过 Array.newInstance(newType.getComponentType(), newLength) 创建目标数组,确保运行时类型正确:
- 传入
String[]→ 返回String[],不是Object[] - 若需向上转型(如
String[]→Object[]),必须显式传参:Arrays.copyOf(strArr, 5, Object[].class) - 编译期泛型检查有效,但运行时不保留泛型信息;不会自动装箱/拆箱
空值与边界仍需调用方防护
该方法不做空检查:
- 若
original == null,直接抛NullPointerException - 若
newLength ,抛 <code>NegativeArraySizeException - 因此使用前建议自行判空或校验长度











