
Java中已有Arrays.copyOf和System.arraycopy等原生方法,但构建自定义数组拷贝工具类能提升代码可读性、统一处理逻辑(如空值校验、类型兼容检查、深拷贝支持),也便于扩展日志、监控或性能统计能力。
基础浅拷贝工具方法
浅拷贝适用于基本类型数组或只关心引用复制的对象数组。核心使用System.arraycopy——它是JVM底层优化的高效方法,比循环赋值快得多。
- 先校验源数组是否为
null,避免运行时异常 - 目标数组长度可灵活指定:小于源数组则截断,大于则用默认值填充(如
0、false、null) - 封装后调用简洁,例如:
ArrayUtils.copy(ints, 10)表示拷贝前10个元素(不足则补0)
泛型安全的拷贝支持
用泛型+类型令牌(Class<t></t>)可支持对象数组创建,避免强制转换和ClassCastException。
- 对
T[]类型,不能直接new T[size],需用Array.newInstance(componentType, size) - 拷贝时仍用
System.arraycopy,它天然支持任意引用类型数组 - 示例签名:
public static <t> T[] copy(T[] src, int newLength, Class<t> type)</t></t>
简单深拷贝能力(限可序列化场景)
若数组元素实现Serializable,可用序列化方式实现轻量深拷贝,适合配置类、DTO等无复杂依赖的对象。
- 将整个数组序列化为字节数组,再反序列化为新实例
- 注意:静态字段、瞬态字段不参与拷贝;含不可序列化成员会抛
NotSerializableException - 不适用于含线程、IO资源、代理对象等场景,生产环境慎用,建议优先用构造器或复制构造函数
增强实用性:支持范围拷贝与默认值填充
实际业务中常需“从索引2开始拷贝5个元素”或“目标数组长度100,缺位填-1”。工具类可内置这些能力:
-
copyRange(T[] src, int from, int length, T[] dest, int destPos)—— 类似System.arraycopy但带语义封装 - 对基本类型提供重载,如
copy(int[] src, int newLength, int defaultValue) - 返回新数组而非复用传入目标数组,符合函数式习惯,避免副作用
不复杂但容易忽略的是边界判断和类型一致性检查。写好单元测试覆盖null输入、负长度、越界索引等 case,这个工具类就能稳定嵌入项目通用包中长期使用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











