Java 数组拷贝技术:利用 Arrays.copyOf 实现多态数据类型的拷贝实战
作者:SoftHope
时间:2026-07-05
浏览:0
Arrays.copyOf通过泛型和重载支持所有数组类型,底层调用原生System.arraycopy实现高效浅拷贝。扩容时自动填充默认值,源数组为null则抛空指针异常。引用类型仅复制引用,需注意泛型类型擦除与子类数组赋值陷阱。返回新数组。
先做个精炼总结:Arrays.copyOf 靠泛型和重载覆盖所有数组类型,底层统一调用 System.arraycopy 实现高效浅拷贝。基本类型走对应重载,引用类型走泛型版本,返回正确类型的数组。扩容时自动填默认值,源数组为 null 则抛出 NPE。就这么简单,但用起来有几个容易踩的坑,下面展开聊聊。

说到拷贝数组,Arrays.copyOf 几乎是最省事的方案——不管你是 int[]、String[] 还是自定义对象数组,它都能一把搞定。它不关心具体类型,只认源数组和目标长度,多态支持全靠泛型和重载托底,实际拷贝过程跟数据类型无关。
支持所有数组类型,无需手动区分
Arrays.copyOf 为每种基本类型(int、double、boolean 等)都准备了重载方法,引用类型则单独配了一个泛型版本。JVM 根据实参类型自动选人,开发者不用写 if 判断,更不用手动做类型转换。
- 基本类型数组:直接走对应重载,比如 Arrays.copyOf(int[], int)
- 引用类型数组:走泛型方法 Arrays.copyOf(T[], int),编译器自动推断类型,运行时保留组件类型
- 重点:泛型版本返回的是 T[],不是
Object[],省得你事后强转
拷贝逻辑统一:底层调用 System.arraycopy
所有重载版本最终都委托给 native 方法 System.arraycopy,效率高、语义一致——浅拷贝、连续内存复制、越界检查全交给 JVM 兜底。
- 新数组长度大于原数组?多余位置自动填默认值(int 填 0,引用类型填 null)
- 新数组长度小于原数组?只复制前 N 个元素,不会抛异常
- 源数组为
null?直接扔NullPointerException,调用方必须自己判空
实战中避开常见陷阱
方法本身不复杂,但类型擦除、泛型边界和子类数组场景容易出幺蛾子。
- 别用
Object[]接收子类数组再拷贝——运行时类型信息一丢,后面就麻烦了。直接拿泛型方法操作原始数组更靠谱 - 拷贝
String[]、Integer[]这些不可变类型完全没问题;但拷贝自定义对象数组时,只是复制了引用,对象本身不会深拷贝 - 需要扩容同时保留原有内容?直接写 Arrays.copyOf(arr, arr.length + 10) 就行,比先
new再System.arraycopy简洁多了
结合泛型工具方法提升复用性
还可以封装一层来适配不同场景,比如加个安全判空或者默认值填充。
- 示例:
public staticT[] safeCopy(T[] src, int newLength) { return src == null ? (T[]) new Object[newLength] : Arrays.copyOf(src, newLength); } - 基本类型数组还是建议直接用原生重载——避免装箱拆箱带来的额外开销
- 泛型方法里不能直接
new T[newLength](类型擦除记得吧),必须靠反射或借用Object[]转型。Arrays.copyOf内部正是这么处理的
作者最新文章
苹果折叠屏iPhone是翻盖还是对折形态
2026-09-14 13:33
速腾聚创自研SPAD-SoC芯片交付破50万颗,MARS基地实现8秒下线一台激光雷达
2026-09-08 17:42
TECNO Camon Slim 5G发布:6.39mm机身与6000mAh电池规格解析
2026-09-08 17:04
小米 18 Fold 暖金白图赏:中折叠形态与核心规格解析
2026-09-08 16:50
PDF文件太大怎么压缩?变小后清晰度怎么看?
2026-09-04 10:02
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































