arrays.copyof 是 java 中创建指定长度新数组并复制内容的高效方式,内部调用 system.arraycopy;长度不足则截取,超出则用默认值填充,支持基本类型和引用类型,但为浅拷贝且不处理 null 输入。

Arrays.copyOf 是 Java 中最常用、最简洁的数组拷贝方式,它能直接创建新数组并复制指定长度的内容,特别适合需要“替换数组内容”但又不想手动遍历的场景。
理解 copyOf 的核心行为
Arrays.copyOf 不是修改原数组,而是返回一个全新数组。它内部调用 System.arraycopy,效率高且安全。关键点在于:它会按指定长度截取或补零——长度大于原数组时,多出位置用默认值(如 int 为 0,Object 为 null)填充;小于原数组时,只复制前 N 个元素。
- 对基本类型数组,扩容后新增元素自动初始化为 0、false 等默认值
- 对引用类型数组,扩容后新增位置为 null,不会触发对象创建
- 如果传入负数长度,会抛出 NegativeArraySizeException
实现“内容替换”的典型用法
所谓“快速替换”,本质是用新数据覆盖旧数组的逻辑。copyOf 本身不改原数组,所以常配合赋值操作完成语义上的替换:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用新数据初始化临时数组,再用 copyOf 截取/扩展成目标长度,最后赋给原引用
- 例如把 int[] arr = {1,2,3} 替换为长度为 5 且前三位保持不变、后两位补 0 的数组:arr = Arrays.copyOf(arr, 5)
- 若想用新值完全替代(比如全换成 9),可先 new 一个新数组填值,再 copyOf 成目标长度,避免循环赋值
与其它拷贝方式对比的关键差异
比起 clone() 或 System.arraycopy,copyOf 更聚焦“生成指定长度的新数组”这一明确目标:
- clone() 只能生成同长度副本,不能缩容或扩容
- System.arraycopy 需要手动指定源/目标数组、起始偏移和长度,易出错且代码冗长
- copyOf 封装了这些细节,一行代码即可完成常见截取、扩容、浅拷贝操作
实战中要注意的边界情况
实际使用时,几个细节容易引发隐性问题:
- 引用类型数组拷贝是浅拷贝:新数组里存的是原对象的引用,修改对象状态会影响两边
- 若需深拷贝,copyOf 无法解决,得配合序列化或手动克隆
- 泛型数组(如 T[])调用 copyOf 时,第二个参数是 int 类型长度,不是 Class,无需传类型信息
- 当原数组为 null 时,copyOf 会直接抛出 NullPointerException,使用前建议判空
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










