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 <p>注意:<code>set</code> 和 <code>get</code> 必须由列表自身支持;若传入不可变列表(如 <code>Collections.unmodifiableList</code>),运行时会抛出 <code>UnsupportedOperationException</code>。</p>
<h3>为什么不用 Collections.swap?</h3>
<p><code>Collections.swap(list, i, j)</code> 本质也是交换,且内部实现同样使用临时变量 + set。但 <code>reverse</code> 没有直接调用它,而是手动写交换逻辑——这是为了减少方法调用开销,并保持逻辑内聚。实际 JDK 源码中(如 OpenJDK)正是采用上述裸循环+get/set方式,未引入额外工具方法。</p>
<h3>使用时的常见注意事项</h3>
<ul>
<li>确保列表非 null,否则抛 <code>NullPointerException</code>
</li>
<li>空列表或单元素列表可安全调用,循环条件 <code>i 自然跳过</code>
</li>
<li>若列表底层是同步包装(如 <code>Collections.synchronizedList</code>),需外部保证线程安全,该方法本身不加锁</li>
<li>对子列表(<code>subList</code>)也有效,但修改的是原始列表对应区域</li>
</ul>
<p>不复杂但容易忽略细节,理解双指针怎么动、在哪停、怎么换,就能稳稳掌握这个高频操作。</p></t></t>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











