system.arraycopy 是 jvm 内存级搬运原语,非普通方法;它跳过 java 层循环与校验,直连底层 memcpy/memmove 或 simd 指令,但仅在基本类型数组长度 ≥256、对象数组引用拷贝等条件下显著提速,小数组(≤16)反慢,且参数错误会立即抛异常。

System.arraycopy 不是普通方法,而是 JVM 提供的内存级搬运原语。它快,是因为跳过 Java 层循环、边界检查和字节码解释,直连底层 memcpy/memmove 或 SIMD 指令;但它不自动适配场景——用错参数、选错时机、忽略类型约束,反而比 for 循环更慢。
什么时候真能提速?看数据量和类型
提速不是默认行为,而是有明确门槛:
- 基本类型数组(int[]、byte[] 等)拷贝长度 ≥ 256 时,JVM 常启用 AVX/SSE 批量指令,优势明显
- 对象数组(String[]、MyBean[])也快,但只复制引用,不触发 GC 写屏障,适合高吞吐中间件
- 长度 ≤ 16 的数组,JNI 调用开销常盖过搬运收益,for 循环更轻量
- 避免在热点循环内反复调用;length、srcPos、destPos 尽量用编译期可推导的常量,利于 JIT 内联
原地重排:靠参数顺序,不是手写逻辑
同一数组内移动数据(如删除后前移、RingBuffer 左移),不用 if 判断方向再写两套 for —— arraycopy 自动处理重叠安全:
- 左移(destPos
- 右移(destPos > srcPos):System.arraycopy(arr, 2, arr, 5, 5),JVM 自动倒序搬运,先搬高位再覆盖低位
- 必须满足:srcPos + length ≤ arr.length 且 destPos + length ≤ arr.length;越界立即抛 ArrayIndexOutOfBoundsException
避坑要点:错一个参数,当场崩溃
它不宽容,所有校验都在运行时一次性完成,不会静默截断或忽略:
- src 或 dest 为 null → NullPointerException
- srcPos、destPos 或 length 为负 → NegativeArraySizeException 或 IndexOutOfBoundsException
- srcPos + length > src.length 或 destPos + length > dest.length → ArrayIndexOutOfBoundsException
- int[] 拷到 long[]、String[] 拷到 Integer[] → ArrayStoreException(运行时,非编译时报错)
- length = 0 合法,可用于边界预检,零开销
比 Arrays.copyOf 和 clone() 更省的场景
当目标数组已存在、长度已知、只需搬数据时,arraycopy 是唯一零分配选择:
- Arrays.copyOf(src, len) 必须 new 新数组,带来堆分配与 GC 压力
- clone() 只支持整数组复制,不能指定起始偏移,也不能复用已有 dst 数组
- 正确做法:提前分配好 dst 数组,再调用 System.arraycopy(src, off, dst, 0, len)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











