Collections.rotate()是Java中专为List设计的原地循环移位方法,支持正数右移、负数左移,自动取模,时间复杂度O(n)、空间复杂度O(1),需确保List可修改。

Collections.rotate() 是 Java 集合工具类中一个高效、简洁的内置方法,专为 List 类型设计,可直接实现元素的**循环左移或右移**,完全避免手动遍历、临时数组或复杂索引计算。
✅ 前提:必须是可修改的 List(不能是 Arrays.asList() 返回的固定大小列表)
该方法只接受 List 接口实现类(如 ArrayList、LinkedList),且要求列表可修改。常见错误是直接对 Arrays.asList(arr) 调用 rotate —— 它返回的是不可扩容/不可结构修改的内部类,调用会抛 UnsupportedOperationException。
正确做法:
- 用
new ArrayList(Arrays.asList(arr))包装成可修改列表 - 或直接初始化为
ArrayList:Listlist = new ArrayList(Arrays.asList(1,2,3,4,5));
✅ 位移方向与距离:正数右移,负数左移
参数 distance 表示“整体移动多少个位置”:
-
Collections.rotate(list, 2)→ 向右平移 2 位:[1,2,3,4,5]→[4,5,1,2,3] -
Collections.rotate(list, -2)→ 向左平移 2 位:[1,2,3,4,5]→[3,4,5,1,2] - 距离自动取模处理:
Collections.rotate(list, 7)等价于rotate(list, 7 % list.size()),安全不越界
✅ 原地操作,时间复杂度 O(n),空间复杂度 O(1)
该方法底层采用“三次反转”算法(类似翻转字符串实现旋转):
- 将后
k个元素反转 - 将前
n−k个元素反转 - 再将整个列表反转
全程不创建新集合,不复制全部元素,比手写 for 循环更简洁、更健壮、性能也更优。
✅ 实用示例:数组转 List 后旋转再转回数组
若起点是普通数组(如 int[] arr),需先转为包装类型列表(因 Collections 不支持基本类型):
int[] arr = {1, 2, 3, 4, 5};
// 转为 Integer 列表(注意:不是 int[] → List<int>,Java 不支持)
List<integer> list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
Collections.rotate(list, 2); // 右移 2 位 → [4, 5, 1, 2, 3]
// 如需转回 int[](JDK 8+ 推荐流式转换)
int[] rotated = list.stream().mapToInt(Integer::intValue).toArray();
</integer></int>
不复杂但容易忽略:只要确保输入是可修改的 List,一行 Collections.rotate() 就能干净完成循环平移。










