arrays.copyof的核心逻辑是先创建新数组再用system.arraycopy拷贝:newlength等于原长则完整复制,小于则截断,大于则补默认值;所有重载最终归结为三参数形式。

Arrays.copyOf 的核心逻辑很明确:先创建新数组,再用 System.arraycopy 拷贝数据。它不修改原数组,也不复用已有容器,每次调用都生成一个全新对象。容量处理的关键在于 newLength 与原数组长度的对比关系,而非“复制多少”,而是“目标容器要多大”。
newLength 决定三种容量行为
该参数直接控制新数组的尺寸和内容填充策略:
- 等于原长:完整复制全部元素,内容一致,但内存地址不同,是真正的独立副本
-
小于原长:只拷贝前
newLength个元素,相当于安全截断,不会越界 -
大于原长:前
original.length个位置照搬原值,剩余位置按类型填默认值(int→0、boolean→false、引用类型→null)
底层创建与拷贝的两步分工
所有重载版本最终都归结为三参数形式:copyOf(U[] original, int newLength, Class extends T[]> newType):
- 数组创建阶段:若
newType == Object[].class,直接new Object[newLength];否则通过Array.newInstance(newType.getComponentType(), newLength)创建指定类型数组 - 数据搬运阶段:统一调用
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)),从索引 0 开始搬运,长度取两者最小值
必须注意的边界与陷阱
看似简单的方法,几个细节极易引发运行时异常:
-
负长度直接报错:
newLength 会抛 <code>NegativeArraySizeException,不进入拷贝流程 -
null 原数组无防护:传入
null会立即触发NullPointerException,调用前需自行判空 - 仅支持浅拷贝:对对象数组,只复制引用,不递归克隆对象本身;若需深拷贝,需额外处理
-
不支持偏移拷贝:始终从源数组索引 0 开始,如需拷贝中间段,应使用
copyOfRange
类型转换与泛型擦除的实际约束
跨类型数组转换需显式传入 newType 参数,例如将 Integer[] 转为 Number[]:
注意两点:
- 类型转换仅作用于数组容器声明,元素本身仍是原类型(
Integer对象仍存于Number[]中) - 运行时若发生不兼容赋值(如把
String放进本应装Integer的数组),会抛ArrayStoreException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











