collections.reverse()原地反转可变列表,不返回新列表;传入null抛npe,空列表静默处理;arrays.aslist()结果不可修改,需先转arraylist;非按元素排序,与stream.sorted(reverseorder())本质不同。

直接用 Collections.reverse() 就行,但必须传可变列表
这个方法不返回新列表,而是原地反转,所以你传进去的 List 必须支持修改。常见坑是传了 Arrays.asList() 返回的列表——它确实能调用成功,但底层数组固定长度,如果后续又调用 add() 或 remove() 就会抛 UnsupportedOperationException。
实操建议:
- 确认你的
List是可修改的,比如new ArrayList(...)、new LinkedList() - 如果来源是数组,别直接用
Arrays.asList(arr)后就反转,先套一层new ArrayList(Arrays.asList(arr)) - 反转后原引用指向的列表内容已变,不需要重新赋值
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
Collections.reverse(list); // ✅ 安全
// list 现在是 ["c", "b", "a"]
Collections.reverse() 对 null 和空列表的处理
它不校验参数,传 null 会直接抛 NullPointerException;传空列表(size() == 0)则安静返回,啥也不做。
使用场景中如果你不确定输入是否为空或为 null,得自己加判断:
立即学习“Java免费学习笔记(深入)”;
- 不希望崩溃:先判
if (list != null) - 不想白跑:再加
&& !list.isEmpty() - 别指望它帮你容错,这是调用方的责任
if (list != null && !list.isEmpty()) {
Collections.reverse(list);
}
和 Stream API 反转的区别:别为了“函数式”硬套
有人看到 stream().sorted(Comparator.reverseOrder()) 就以为能反转,其实那是按元素自然序倒排,不是按位置倒序。比如 [3, 1, 4] 用 sorted(reverseOrder()) 得到 [4, 3, 1],而 Collections.reverse() 得到 [4, 1, 3] —— 完全是两回事。
性能上也差一截:
-
Collections.reverse()是 O(n),就地交换,无额外对象 - Stream 方式要创建新 List、排序(O(n log n))、还得指定比较逻辑,纯属误用
- 真要不可变结果,用
Lists.reverse(list)(Guava)或手动构建新列表
泛型擦除不影响反转,但要注意运行时类型
Collections.reverse() 方法签名是 public static void reverse(List> list),所以任何 List 都能进,编译期不报错。但如果你的列表实际装的是不同子类对象(比如 List<number></number> 里混了 Integer 和 Double),反转本身没问题,出问题往往在后续遍历时强转失败。
关键点:
- 反转动作本身跟泛型类型无关,擦除后就是操作
Object[] - 真正容易翻车的是反转后你写了
(String) list.get(0),而它其实是Integer - 别依赖反转改变类型安全,该用
instanceof还是要用
Collections.unmodifiableList() 包裹过的列表直接传进去,然后卡在运行时异常里。这些都不是方法的问题,是调用上下文没理清。









