collections.rotate()用于循环移位list元素:正数distance向右移(末尾元素前移),负数向左移(首部元素后移);支持子列表操作且自动对长度取模。

Collections.rotate() 是 Java 集合工具类中一个高效、简洁的循环移位方法,它能直接对 List(如 ArrayList)进行左移或右移,完全避免手动复制、截取、拼接等繁琐逻辑。
理解 rotate 的偏移方向与数值含义
该方法签名是:Collections.rotate(List> list, int distance)。
- 当 distance > 0:向右循环移动(末尾元素移到前面);
- 当 distance :向左循环移动(首部元素移到后面);<br>
- 实际移动步数为 <code>distance % list.size(),自动处理越界和整圈情况。
例如:[1,2,3,4,5] 执行 rotate(list, 2) → [4,5,1,2,3];rotate(list, -1) → [2,3,4,5,1]。
必须使用可变 List,不能直接用于数组
Collections.rotate() 只接受 List 接口实现,不支持原始数组(如 int[])。需先转为支持修改的列表:
- 对于对象数组(如
String[]),用Arrays.asList(arr)转换,但注意返回的是固定大小列表,需进一步包装:List<string> list = new ArrayList(Arrays.asList(arr));</string> - 对于基本类型数组(如
int[]),需先转为装箱类型列表,例如用 Stream:List<integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());</integer> - 操作完成后,如需还原为数组,调用
list.toArray(new Type[list.size()])即可。
原地操作,无需额外空间
该方法在原列表上直接修改,时间复杂度 O(n),空间复杂度 O(1) —— 内部采用三次反转算法(类似“翻转单词”思路),不依赖临时缓冲区。相比手写 for 循环逐个取放,既安全又高效,也规避了并发修改或角标越界风险。
注意不可修改列表的陷阱
若传入的是 Arrays.asList() 返回的列表(未包装成 ArrayList),它底层是数组的视图,不支持 add/remove,但 rotate() 仅做元素交换,**多数 JDK 版本下仍可成功运行**;不过为求稳妥和语义清晰,建议统一用 new ArrayList(...) 包装后再调用。










