Arrays.copyOf存在五大反模式:非原地修改需显式赋值;不校验null输入;泛型数组需指定类型参数;无法偏移复制应改用copyOfRange;负长度触发NegativeArraySizeException。

Arrays.copyOf 看似简单,但实际使用中常因误解语义或忽略边界而掉进“反模式”陷阱。它不是原地修改,也不做空防护,更不支持偏移复制——这些特性若被忽视,轻则逻辑错乱,重则运行时崩溃。
忘记赋值导致“假扩容”
数组长度不可变,copyOf 返回的是全新数组对象,原引用不会自动更新。
- ❌ 错误写法:
Arrays.copyOf(arr, 10);—— arr 仍指向旧数组,长度未变 - ✅ 正确写法:
arr = Arrays.copyOf(arr, 10);—— 显式重新绑定引用 - ⚠️ 特别注意:若 arr 是方法参数且无返回值,外部变量完全不受影响
对 null 输入不做防护
Arrays.copyOf(null, 5) 直接抛 NullPointerException,它不校验输入合法性。
- ❌ 危险调用:
Arrays.copyOf(userInputArray, 10)(userInputArray 可能为 null) - ✅ 安全写法:
userInputArray == null ? new String[10] : Arrays.copyOf(userInputArray, 10) - ? 提示:空数组(
new int[0])是安全的,无需额外判断
泛型数组类型擦除引发 ClassCastException
对 List<String>[] 或 MyBean[] 等泛型数组,仅传两个参数会返回 Object[],强制转型时报错。
- ❌ 危险写法:
lists = Arrays.copyOf(lists, 5);→ 编译通过,运行时报ClassCastException - ✅ 正确写法:
lists = Arrays.copyOf(lists, 5, ArrayList[].class); - ? 基本类型数组(
int[]、double[])无此问题,可放心用两参数重载
误用 copyOf 替代 copyOfRange
copyOf 总是从索引 0 开始复制,无法指定起始位置。想取后半段却硬凑,结果出错。
- ❌ 错误尝试:
Arrays.copyOf(arr, 3)想取最后 3 个元素 —— 实际取的是前 3 个 - ✅ 正确选择:
Arrays.copyOfRange(arr, arr.length - 3, arr.length) - ⚠️ 补充:
System.arraycopy虽灵活,但参数顺序易错(如 srcPos/destPos 写反),需格外谨慎
传入负长度未校验
newLength 小于 0 时,不抛 IllegalArgumentException,而是直接触发 NegativeArraySizeException —— 这个异常通常意味着逻辑路径失控。
- ❌ 隐患代码:
Arrays.copyOf(data, computeNewLen() - 1)(computeNewLen() 返回 0) - ✅ 防御写法:提前校验
if (newLen 或设下限 <code>Math.max(1, newLen)


















