system.arraycopy是实现数组循环移位的高效核心工具,需分步拆解左/右移逻辑或采用三次反转法,配合k取模、空数组校验等健壮性处理,才能安全、最优地完成原地移位。

Java 数组遍历是实现平移与移位操作的基础,但真正关键的不是“怎么遍历”,而是“遍历时如何组织逻辑来移动数据”。直接用 for 循环逐个赋值可行,但容易出错;用 System.arraycopy 或三次反转法则更高效、安全、可复用。
基础遍历 + 手动移位(适合理解原理)
这是最直观的方式,分左移和右移两种场景:
- 右移一位:保存最后一个元素,从后往前复制(避免覆盖),再把保存的值放回开头
- 左移一位:保存第一个元素,从前往后复制,再把保存的值放末尾
- 若要移
k位,可循环执行k次——但效率低(O(n×k)),仅适合教学或小数组
System.arraycopy 高效平移(推荐日常使用)
该方法底层调用本地代码,速度快且语义清晰,无需手动控制下标边界。例如右移 k 位:
- 先将后
k个元素复制到新位置(开头) - 再将前
n−k个元素复制到后面 - 注意:需提前处理
k %= arr.length,防止越界或整圈无效移动
三次反转法原地旋转(最优空间效率)
不申请额外数组,全程在原数组上操作,空间复杂度严格为 O(1),适合大数组或内存敏感场景:
- 右移
k位 → 先整体反转,再反转前k个,最后反转后n−k个 - 左移
k位 → 先反转前k个,再反转后n−k个,最后整体反转 - 核心辅助方法只需一个
reverse(int[] arr, int l, int r),用 while 双指针交换即可
边界与健壮性处理要点
实际开发中容易忽略但必须检查的几项:
- 数组为
null或长度为 0 时直接返回,避免空指针 - 移位数
k可能远大于数组长度,务必先取模:k = k % arr.length - 若取模后
k == 0,无需任何操作,提前退出 - 遍历时下标范围始终是
[0, length - 1],切忌写成length(常见ArrayIndexOutOfBoundsException根源)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











