system.arraycopy本身不直接实现平移,但可通过暂存+分段复制模拟循环或非循环平移;循环右移需先暂存后k个再搬前n−k个,循环左移则相反;非循环平移补零时直接复制并设边界值;其性能优于for循环因底层调用native优化指令。

System.arraycopy 本身不直接实现“平移”(如左移、右移),它只是高效地复制一段数组数据到另一段位置。但你可以用它来**模拟平移效果**,核心思路是:先保存被覆盖的部分,再用 arraycopy 搬移其余元素,最后把保存的部分填回合适位置。
右移 k 位(循环右移)
比如数组 [1,2,3,4,5] 右移 2 位 → [4,5,1,2,3]。关键是要把后 k 个元素暂存,再把前 n−k 个元素挪到后面,最后把暂存的放前面。
操作步骤:
- 用
arraycopy(src, n−k, dst, 0, k)把后 k 个复制到开头 - 用
arraycopy(src, 0, dst, k, n−k)把前 n−k 个复制到 k 开始的位置 - 注意:如果原地平移(src 和 dst 是同一数组),顺序很重要——必须先搬前半段,否则后 k 个会被覆盖;更稳妥的做法是先复制后 k 个到临时数组,再整体搬动
左移 k 位(循环左移)
同理,[1,2,3,4,5] 左移 2 位 → [3,4,5,1,2]。先暂存前 k 个,再把后 n−k 个移到开头,最后填回尾部。
常用写法(原地操作):
- 先
arraycopy(arr, 0, temp, 0, k)保存前 k 个 - 再
arraycopy(arr, k, arr, 0, n−k)把后面部分前移 - 最后
arraycopy(temp, 0, arr, n−k, k)把暂存内容贴到末尾
非循环平移(补零或丢弃)
如果不需要循环,只是简单“整体右移”,空出的位置补 0,末尾元素丢弃:
- 右移 1 位:
arraycopy(arr, 0, arr, 1, arr.length−1),再设arr[0] = 0 - 左移 1 位:
arraycopy(arr, 1, arr, 0, arr.length−1),再设arr[arr.length−1] = 0 - 这种操作不涉及暂存,但要注意索引范围,避免越界
为什么不用 for 循环?
arraycopy 是 native 方法,底层通常调用 memmove 或 SIMD 指令,比 Java 层逐个赋值快得多,尤其对大数组优势明显。但它的“平移”能力依赖你组织好源/目标区间和暂存逻辑——它不自动处理重叠或循环,只是忠实搬运。
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











