System.arraycopy 是 Java 中高效复制数组的底层方法,需预先分配目标数组,仅支持浅拷贝,参数缺一不可且须严格校验边界,适用于批量数据迁移等场景。

System.arraycopy 是 Java 中高效复制数组的底层方法,适合处理基本类型、对象引用甚至嵌套数组结构。它不创建新数组,只拷贝元素,因此必须提前分配目标数组空间;对对象数组,它默认只复制引用(浅拷贝),若需深拷贝需额外处理。
掌握 System.arraycopy 的核心参数与调用逻辑
该方法签名是:System.arraycopy(src, srcPos, dest, destPos, length)。五个参数缺一不可:
- src:源数组,不能为空,否则抛 NullPointerException
- srcPos:从源数组哪个索引开始拷贝(含),必须 ≥ 0 且 ≤ src.length
- dest:目标数组,也不能为空,且类型需与 src 兼容(如 int[] → int[],String[] → Object[])
- destPos:拷贝到目标数组的起始位置,同样需满足 0 ≤ destPos ≤ dest.length
- length:要拷贝的元素个数,必须 ≥ 0,且 srcPos + length ≤ src.length,destPos + length ≤ dest.length
任意参数越界都会触发 ArrayStoreException 或 IndexOutOfBoundsException,建议在调用前做简单边界校验,尤其在动态计算位置时。
处理二维数组:逐行拷贝实现“伪深拷贝”
二维数组本质是一维数组,每个元素是引用(如 int[][] 中每个元素是 int[])。直接用 arraycopy 只能复制外层数组引用,无法隔离内层数组。若想让目标二维数组与原数组互不影响(即修改某行不波及对方),需手动逐行分配并拷贝:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 先 new 出目标二维数组:int[][] target = new int[src.length][];
- 遍历每行:for (int i = 0; i
- 这样每行都是独立的新数组,但仍是浅拷贝——若元素是自定义对象,其内部字段仍共享引用
应对泛型与对象数组:注意运行时类型擦除与 ClassCastException
使用 Object[] 存储泛型集合结果很常见,但 arraycopy 对泛型无感知。例如把 ArrayList
- 安全做法:确保 dest 数组声明类型与 src 元素运行时类型一致,或统一用 Object[] 作中转
- 避免写法:System.arraycopy(strings, 0, new String[10], 0, 5) → 正确;System.arraycopy(objects, 0, new String[10], 0, 5) → 危险,哪怕 objects 里全是 String 实例
- 必要时可用 Arrays.copyOf 替代,它内部封装了类型检查和兼容性处理
性能对比与适用边界:什么场景该选 arraycopy?
arraycopy 是 JVM 内部优化的本地方法,比 for 循环快 2–5 倍,尤其在大数组(>1000 元素)或频繁拷贝时优势明显。但它不支持过滤、转换或条件跳过——所有拷贝都是连续、等长、原样搬运。
- 适合场景:批量迁移数据、缓存更新、算法中间态备份、JNI 数据传递准备
- 不适合场景:需要去重/排序/映射后再拷贝;源目标长度不匹配需动态裁剪;元素需序列化或构造新实例
- 小数组(

















