Arrays.copyOf 不扩展原数组边界,而是新建数组并按newLength复制或截断数据:等于原长则完整复制,小于则截断,大于则补默认值;负长抛NegativeArraySizeException,null原数组抛NullPointerException;泛型数组需显式传类型,扩容必须赋值引用才生效。

Arrays.copyOf 不做边界“扩展”,它只按指定长度创建新数组并搬运数据——所谓“扩展”,是开发者用它替换原引用后产生的效果。
newLength 决定行为,不是“伸缩”而是“重建”
该方法从不修改原数组,每次调用都新建一个独立数组对象。它的“边界处理”本质是根据 newLength 与原数组长度的大小关系,决定复制多少、补什么:
- newLength == original.length:完整复制,内容一致,地址不同
- newLength < original.length:只复制前
newLength个元素,相当于安全截断 - newLength > original.length:前
original.length个元素照搬,剩余位置填默认值(int[]补 0,String[]补null,boolean[]补false)
越界不兜底,负长直接崩
边界校验发生在复制之前,非常严格:
-
newLength为负数 → 抛NegativeArraySizeException,根本不会走到拷贝阶段 - 原数组为
null→ 直接抛NullPointerException,不作空值容错 - 对空数组(
new int[0])完全支持,返回指定长度的新数组,无异常
泛型数组需显式传类型,否则运行时翻车
类型擦除导致泛型数组(如 List<String>[])无法靠两参数重载推断目标类型:
- 错误写法:
lists = Arrays.copyOf(lists, 5)→ 可能抛ClassCastException - 正确写法:
lists = Arrays.copyOf(lists, 5, ArrayList[].class) - 基本类型数组(
int[]、double[])无此问题,可直接用两参数版本
扩容必须赋值引用,否则等于没做
Java 数组长度不可变,“扩容”只是逻辑假象:
- ❌
Arrays.copyOf(arr, 10);—— arr 仍指向旧数组,长度不变 - ✅
arr = Arrays.copyOf(arr, 10);—— 引用更新,后续使用才是新数组 - 若 arr 是方法参数且未返回,外部变量不受影响,需靠返回值或包装类传递

















