system.arraycopy高效平移数组因其底层调用jvm本地内存拷贝,避免java层逐元素读写和边界检查;右移需反向拷贝防覆盖,左移可正向;注意k取模、同数组时偏移计算及多维数组仅复制引用。

用 System.arraycopy 平移数组,比手动循环快得多,关键在搞清源、目标、起止偏移和长度这五个参数的对应关系。
为什么 arraycopy 能高效平移?
它底层调用的是 JVM 的本地内存拷贝(类似 C 的 memmove),避免了 Java 层逐个元素读写和边界检查开销。尤其对大数组(几千元素以上),性能差距明显——实测常快 3~5 倍。
注意:它不支持跨数组类型转换(比如 int[] → long[]),也不能自动扩容,平移前得确保目标位置有足够空间。
向右平移:留出空位,从尾部开始拷贝
把数组后 k 个元素移到前面,原前 n−k 个元素顺延到后面(即循环右移)。必须从末尾反向拷贝,否则会覆盖未复制的数据。
- 先备份最后
k个元素(或直接用 arraycopy 到临时空间) - 用
arraycopy(src, 0, dst, k, length - k)把前段后移 - 再把备份的
k个填回开头:arraycopy(temp, 0, dst, 0, k)
示例:int[] a = {1,2,3,4,5},右移 2 位 → {4,5,1,2,3}
向左平移:从头部开始,无覆盖风险
左移相对简单,因为移动方向与拷贝方向一致,不会覆盖待读数据。
- 直接
System.arraycopy(a, k, a, 0, a.length - k) - 再把原末尾
k个元素补到尾部(若需循环左移)
例如:{1,2,3,4,5} 左移 2 位,执行后数组前 3 位变成 {3,4,5},剩下位置需手动填充或清零。
边界处理与常见陷阱
k 可能大于数组长度,先取模:k = k % a.length;k == 0 时直接返回,避免无效拷贝。
别混淆 src 和 dst —— 若想原地平移,src 和 dst 是同一个数组,但 offset 必须计算准确;若 src ≠ dst,要确保目标数组已初始化且容量足够。
多维数组不能直接用 arraycopy 平移整行(它只复制引用),如需深平移,得对每行单独调用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











