三分钟了解 System.arraycopy

三分钟了解 System.arraycopy

System.arraycopy 方法 是 Java 中 System 类提供的 arraycopy 方法,是一个 native(本地)方法,用于高效地复制数组内容。以下是详细解释:


方法签名解析

public static native void arraycopy(
    Object src,  int srcPos,   // 源数组及起始位置
    Object dest, int destPos,  // 目标数组及起始位置
    int length                 // 要复制的元素个数
);

参数说明

参数 类型 作用
src Object 源数组(可以是任意类型的数组,如 int[]String[] 等)。
srcPos int 源数组中开始复制的起始索引(从 0 开始)。
dest Object 目标数组(必须与源数组类型兼容)。
destPos int 目标数组中粘贴数据的起始索引
length int 要复制的元素数量(从 srcPos 开始计算)。

核心功能

  1. 高效复制

    • 直接通过 JVM 底层实现native 方法)操作内存,比手动循环复制更快。
    • 适用于大规模数据拷贝(如数组扩容、批量数据迁移)。
  2. 浅拷贝(Shallow Copy)

    • 仅复制数组元素的引用(对于对象数组),不克隆对象本身。
  3. 数据覆盖规则

    • 如果 srcdest 是同一个数组,会自动处理重叠区域(类似 memmove)。

使用示例

int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[5];

// 将 src 从索引 1 开始的 3 个元素,复制到 dest 的索引 0 处
System.arraycopy(src, 1, dest, 0, 3);
// dest 结果: [2, 3, 4, 0, 0]

注意事项

  1. 异常情况

    • 如果参数不合法(如 null 数组、越界索引、负长度),抛出:
      • NullPointerException(数组为 null
      • ArrayStoreException(数组类型不兼容)
      • IndexOutOfBoundsException(索引或长度越界)。
  2. 性能优势

    • 比手动 for 循环复制快约 5-10 倍(实测数据,依赖 JVM 实现)。
  3. 多线程安全

    • 无锁操作,但需保证源数组和目标数组不被并发修改

底层实现(JVM 角度)

graph LR A[Java 调用 arraycopy] --> B[JVM 的 native 方法] B --> C[C++ 实现: memcpy/memmove] C --> D[CPU 指令优化: REP MOVSB*]

注:现代 JVM 会根据硬件特性选择最优复制指令(如 SSE/AVX 向量化指令)。


典型应用场景

  1. 集合类扩容
    • ArrayListgrow() 方法中用于拷贝旧数组到新数组。
  2. 批量数据操作
    • 需要快速截取、合并或移动数组片段时。
  3. 零拷贝优化
    • 结合 ByteBuffer 用于网络 I/O 或文件操作。
posted @ 2025-04-06 22:17  皮皮是个不挑食的好孩子  阅读(736)  评论(0)    收藏  举报