arrays.copyof核心逻辑分两步:先创建新数组,再用system.arraycopy拷贝数据;newlength决定行为:等于原长则全量复制,小于则截断,大于则补默认值;负长度抛异常,null原数组抛npe。

Arrays.copyOf 的核心逻辑:两步走
这个方法表面看只是“复制数组”,实际执行分两步:先创建新数组,再用 System.arraycopy 拷贝数据。它不操作原数组,也不复用目标容器——每次调用都新建一个独立数组对象。
关键参数行为解析
最常用重载是 copyOf(T[] original, int newLength),它的行为由 newLength 与 original.length 的大小关系 决定:
- newLength == original.length:完全复制,内容一致,内存地址不同
- newLength
- newLength > original.length:前 original.length 个元素照搬,剩余位置填默认值(int→0,boolean→false,引用类型→null)
底层调用链与类型处理
单参数版本本质是调用三参数版本:copyOf(original, newLength) → copyOf(original, newLength, original.getClass())
三参数版本中,newType 参数决定新数组的运行时类型:
- 若 newType 是 Object[].class,则直接 new Object[newLength]
- 否则通过
Array.newInstance(newType.getComponentType(), newLength)创建指定类型的数组 - 最后统一用
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength))完成数据搬运
注意边界与陷阱
该方法看似简单,但几个细节容易踩坑:
- newLength 为负数会直接抛 NegativeArraySizeException,不等进入 arraycopy 阶段
- 原始数组为 null 时,会 NPE —— 它不做空值防护,调用前需自行判空
- 虽然支持泛型,但运行时擦除,类型安全依赖编译期检查;跨类型转换(如 String[] → Object[])需显式传 newType
- 拷贝始终从索引 0 开始,无法指定起始偏移 —— 这是
copyOfRange的职责











