三分钟了解 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 开始计算)。 |
核心功能
-
高效复制
- 直接通过 JVM 底层实现(
native方法)操作内存,比手动循环复制更快。 - 适用于大规模数据拷贝(如数组扩容、批量数据迁移)。
- 直接通过 JVM 底层实现(
-
浅拷贝(Shallow Copy)
- 仅复制数组元素的引用(对于对象数组),不克隆对象本身。
-
数据覆盖规则
- 如果
src和dest是同一个数组,会自动处理重叠区域(类似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]
注意事项
-
异常情况
- 如果参数不合法(如
null数组、越界索引、负长度),抛出:NullPointerException(数组为null)ArrayStoreException(数组类型不兼容)IndexOutOfBoundsException(索引或长度越界)。
- 如果参数不合法(如
-
性能优势
- 比手动
for循环复制快约 5-10 倍(实测数据,依赖 JVM 实现)。
- 比手动
-
多线程安全
- 无锁操作,但需保证源数组和目标数组不被并发修改。
底层实现(JVM 角度)
graph LR
A[Java 调用 arraycopy] --> B[JVM 的 native 方法]
B --> C[C++ 实现: memcpy/memmove]
C --> D[CPU 指令优化: REP MOVSB*]
注:现代 JVM 会根据硬件特性选择最优复制指令(如 SSE/AVX 向量化指令)。
典型应用场景
- 集合类扩容
ArrayList的grow()方法中用于拷贝旧数组到新数组。
- 批量数据操作
- 需要快速截取、合并或移动数组片段时。
- 零拷贝优化
- 结合
ByteBuffer用于网络 I/O 或文件操作。
- 结合

浙公网安备 33010602011771号