Collections.reverse基于双指针交换思想实现,时间复杂度O(n)、空间复杂度O(1),通过首尾索引向中间靠拢并交换元素,适用于随机访问列表,手写实现需注意null检查与不可变列表异常。

Collections.reverse 是 Java 中用于反转 List 元素的便捷方法,其底层正是基于经典的双指针交换思想实现的——无需额外空间,仅通过首尾指针向中间靠拢并逐个交换元素。
双指针交换的核心逻辑
该算法维护两个索引:一个从开头(0)开始,一个从末尾(list.size() - 1)开始。每次循环中,交换这两个位置的元素,然后将左指针右移、右指针左移,直到两者相遇或交错。
- 时间复杂度为 O(n),仅遍历一半元素
- 空间复杂度为 O(1),原地操作,不依赖新集合
- 适用于所有支持随机访问的
List实现(如ArrayList),对LinkedList效率略低(因get(i)是 O(n))
手写等效实现示例
你可以用几行代码还原 Collections.reverse 的行为:
public static <T> void reverse(List<T> list) {
int size = list.size();
for (int i = 0, j = size - 1; i < j; i++, j--) {
T temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}注意:set 和 get 必须由列表自身支持;若传入不可变列表(如 Collections.unmodifiableList),运行时会抛出 UnsupportedOperationException。
立即学习“Java免费学习笔记(深入)”;
为什么不用 Collections.swap?
Collections.swap(list, i, j) 本质也是交换,且内部实现同样使用临时变量 + set。但 reverse 没有直接调用它,而是手动写交换逻辑——这是为了减少方法调用开销,并保持逻辑内聚。实际 JDK 源码中(如 OpenJDK)正是采用上述裸循环+get/set方式,未引入额外工具方法。
使用时的常见注意事项
- 确保列表非 null,否则抛
NullPointerException - 空列表或单元素列表可安全调用,循环条件
i < j自然跳过 - 若列表底层是同步包装(如
Collections.synchronizedList),需外部保证线程安全,该方法本身不加锁 - 对子列表(
subList)也有效,但修改的是原始列表对应区域
不复杂但容易忽略细节,理解双指针怎么动、在哪停、怎么换,就能稳稳掌握这个高频操作。


















