Arrays.copyOf 创建新数组而非修改原数组;需赋值引用才能生效,newLength 决定截断或补零,泛型数组须传 Class 类型,null 输入需手动防护。

Arrays.copyOf 不是改变原数组,而是生成一个新数组——这是理解它“优雅处理数组大小”的起点。
扩容与缩容的本质是替换引用
Java 数组长度不可变,所谓扩容或缩容,实际是创建新数组 + 复制内容 + 重新赋值引用。常见错误是调用完没赋值:
- ❌ 错误写法:
Arrays.copyOf(arr, 10);—— arr 仍是原来那个小数组 - ✅ 正确写法:
arr = Arrays.copyOf(arr, 10);—— 引用指向新数组 - 若 arr 是方法参数且未返回,外部变量不会更新,需通过返回值或包装类传递
按需控制新长度:截断、补零、预估增长
newLength 参数决定行为逻辑:
- 小于原长 → 截取前 N 个元素(如
copyOf(arr, 3)取前三) - 大于原长 → 原内容照搬,多余位置填默认值(
int[]补 0,String[]补 null) - 推荐动态计算新长度,避免硬编码:
int newLength = Math.max(oldLen + 1, (int)(oldLen * 1.5));
泛型数组必须显式传 Class 类型
对 List<String>[] 或 MyBean[] 这类泛型数组,直接用 copyOf(arr, n) 会因类型擦除导致运行时 ClassCastException:
- ❌ 危险写法:
lists = Arrays.copyOf(lists, 5); - ✅ 安全写法:
lists = Arrays.copyOf(lists, 5, ArrayList[].class); - 基本类型数组(
int[]、double[])无此问题,可直接使用两参数重载
空数组和 null 输入要手动防护
Arrays.copyOf(null, 5) 会直接抛 NullPointerException,它不做空保护:
- 若原始数组可能为 null,需提前判断:
arr == null ? new int[5] : Arrays.copyOf(arr, 5) - 对空数组(
new int[0]),copyOf 行为正常,返回指定长度的新数组 - 不建议依赖 copyOf 做边界兜底,防御性编程应在调用前完成

















