system.arraycopy是jvm底层内存搬运指令,高效但需严格校验五参数:src、srcpos、dest、destpos、length;要求非空、越界检查、类型兼容、原地移位自动处理;性能优势在基本类型数组长度≥256时启用simd,小数组用for更优。

System.arraycopy 不是普通复制方法,而是 JVM 直接调度内存搬运的底层指令。它快,但只在参数写对、场景选对、规模用对时才真正快;参数错一个,立刻抛异常,不给机会。
五个参数必须逐个校验
调用格式固定:System.arraycopy(src, srcPos, dest, destPos, length)。每个参数都有明确边界,缺一不可:
- src 和 dest 都不能为 null,否则直接抛 NullPointerException
- srcPos ≥ 0,且 srcPos + length ≤ src.length,否则 ArrayIndexOutOfBoundsException
- destPos ≥ 0,且 destPos + length ≤ dest.length,越界即崩
- length ≥ 0;等于 0 合法,常用于快速预检边界,不耗性能
- 类型必须兼容:int[] → int[] ✅,int[] → long[] ❌,String[] → Object[] ✅,Integer[] → int[] ❌
原地移位靠参数,不靠手写方向判断
当 src == dest 时,JVM 自动识别重叠并选择搬运方向,无需 if 分支判断左移还是右移:
- 左移(destPos :如 System.arraycopy(arr, 4, arr, 2, 5),JVM 正向执行,安全
- 右移(destPos > srcPos):如 System.arraycopy(arr, 2, arr, 5, 5),JVM 倒序搬运,先处理高位再覆盖低位
- 只要满足 srcPos + length ≤ arr.length 且 destPos + length ≤ arr.length,就安全
- 避免 destPos == srcPos 且 length > 0 的“空搬运”,纯属浪费校验开销
性能不是默认就有,得按条件启用
arraycopy 的速度优势有明确阈值和前提,盲目使用反而更慢:
- 基本类型数组(byte[]、int[] 等)长度 ≥ 256 时,JVM 可启用 SIMD 指令,提速明显
- 长度 ≤ 16 时,JNI 调用开销盖过搬运收益,for 循环更稳
- 推荐写法:if (len
- length 尽量用编译期常量(如 1024),利于 JIT 内联与向量化;避免传 packet.length 这类变量
- 目标数组必须提前分配好,arraycopy 从不 new、不扩容,少一个元素就抛异常
截取、拼接、翻转的实用模式
这些操作本质都是地址偏移控制,不是语法糖,每一步都依赖参数算准:
- 截取 [from, to):srcPos = from,length = to − from,dest 必须已分配且长度 ≥ length
- 拼接 a + b:先 new int[a.length + b.length],再分两步 —— System.arraycopy(a, 0, result, 0, a.length);System.arraycopy(b, 0, result, a.length, b.length)
- 翻转数组:最简可靠方式是先拷到临时数组,再反向拷回;若追求零额外空间,需分段搬运并严格控制 offset,避免中间覆盖
- 网络/音视频常见模式:预分配大 buffer(如 byte[65536]),每次用 arraycopy 将有效 payload 搬入指定偏移,复用内存,避开 GC
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











