Collections.rotate()用于List原地循环移位:distance>0右移,<0左移,实际步数为distance%size;仅适用于List,就地修改,自动优化大距离。

Collections.rotate() 是 Java 集合工具类中一个简洁高效的方法,用于对 List 进行**原地循环移位**(不创建新列表),支持左移和右移,关键在于传入的 distance 参数正负号和取模逻辑。
理解 distance 参数的含义
调用形式:Collections.rotate(list, distance)
- 当
distance > 0:表示**向右循环移位**(即末尾元素移到前面) - 当
distance < 0:表示**向左循环移位**(即首元素移到后面) - 实际移位步数为
distance % list.size()(自动处理越界和负数) - 若列表为空或只有一个元素,调用无效果
实现循环右移(例如右移 2 位)
右移 2 位等价于把最后 2 个元素“拎到”开头:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d", "e"));
Collections.rotate(list, 2); // 右移 2
// 结果:["d", "e", "a", "b", "c"]
原理:等价于 Collections.rotate(list, 2 % 5 = 2),内部将后 2 个元素与前 3 个交换位置。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
实现循环左移(例如左移 2 位)
左移 2 位可直接传负数,也可用等效正数(推荐负数更直观):
- 方式一(推荐):
Collections.rotate(list, -2) - 方式二(等效):
Collections.rotate(list, list.size() - 2)→ 即rotate(list, 3)(对 5 元素列表)
示例:
List<Integer> nums = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); Collections.rotate(nums, -2); // 左移 2 // 结果:[3, 4, 5, 1, 2]
注意事项与实用技巧
- 只适用于
List实现(如ArrayList、LinkedList),不支持Set或数组 - 操作是**就地修改**,原列表被改变,不返回新列表
- 对
LinkedList,时间复杂度接近 O(k),k 是移位距离;对ArrayList是 O(n),但常数小,实际很快 - 若需不可变结果,先复制:
new ArrayList<>(originalList)再 rotate - 移位距离极大时(如
distance = 1000000),无需担心性能——方法内部已做% size优化

















