在Java中如何使用Collections.reverse反转集合_Java集合顺序操作解析

千丽酱_7730

千丽酱_7730

2026-01-13

996人浏览

原创

Collections.reverse()仅支持可修改的List类型,原地反转且不返回新列表;传入null会抛NullPointerException,非List类型或不可变集合会报错,多线程下需额外同步。

在java中如何使用collections.reverse反转集合_java集合顺序操作解析

直接调用 Collections.reverse() 即可反转 List,但仅支持 List 类型

Collections.reverse() 是最常用、最轻量的反转方式,但它只接受 List 接口及其实现类(如 ArrayList、LinkedList),对 Set、Map 或只读集合会抛出 UnsupportedOperationException 或编译失败。

常见错误现象:传入 Arrays.asList() 返回的“伪可变”列表后调用 add() 或 remove() 报错 —— 但 reverse() 本身是安全的,因为它只改顺序,不增删元素。

  • 必须确保传入的是可修改的 List 实例;若来源是 Arrays.asList(new String[]{"a","b"}),它返回的是固定大小列表,reverse() 可用,但后续若尝试 add() 就会失败
  • 不支持 Set:想“反转 Set”,本质无序,需先转成 ArrayList 再反转
  • 不支持 Map:需提取 keySet() 或 entrySet() 转为 List 后操作

反转前先确认 List 是否为空或为 null,避免 NullPointerException

虽然 Collections.reverse() 自身对空 List 安全(无副作用),但若传入 null,会直接抛出 NullPointerException。生产代码中常忽略这一层防御。

使用场景:从 DAO 层查出的 List 可能为 null(尤其 MyBatis 某些配置下未设默认返回空集合)。

  • 推荐写法:
    if (list != null) {
        Collections.reverse(list);
    }
  • 更稳妥可用 Objects.requireNonNullElse(list, Collections.emptyList()),但注意这返回的是不可变空列表,再传给 reverse() 会报错 —— 所以仍需判空后处理
  • 不要依赖 try-catch 捕获 NullPointerException 来兜底,这是反模式

想反转并生成新 List?别用 reverse(),改用 Stream + Collectors.collectingAndThen

Collections.reverse() 是 in-place 操作(原地修改),无法返回新集合。如果需要保留原始顺序、仅获取一个反转副本,必须手动复制。

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载

性能影响:对大列表,new ArrayList(original) + reverse() 比纯 Stream 方式略快,但可读性差;Stream 写法更函数式,但要注意中间操作开销。

  • 推荐副本方案(Java 10+):
    List<string> reversed = new ArrayList(original);
    Collections.reverse(reversed);</string>
  • Stream 方案(需反转索引):
    List<string> reversed = IntStream.range(0, original.size())
        .mapToObj(i -> original.get(original.size() - 1 - i))
        .collect(Collectors.toList());</string>
  • 注意:Stream 方案在 LinkedList 上性能极差(get(i) 是 O(n)),务必只用于 ArrayList 或数组

并发环境不能直接用 Collections.reverse()

该方法没有任何同步机制。若多个线程同时读写同一个 List,即使只调用 reverse(),也会引发 ConcurrentModificationException 或数据错乱(尤其在 ArrayList resize 过程中被反转)。

使用场景:后台定时任务批量处理共享缓存列表,或 Web 应用中将列表存在 ServletContext 中被多请求访问。

  • 安全做法:用 Collections.synchronizedList() 包装,但仅包装不等于线程安全 —— reverse() 仍是多步操作,需额外加锁
  • 更合理方案:反转操作前加 synchronized(list) 块,或改用不可变集合(如 ImmutableList from Guava)+ 构建新反转副本
  • 别试图用 CopyOnWriteArrayList:它适合读多写少,但 reverse() 会触发全量复制,内存和 CPU 开销巨大

实际中最容易被忽略的,是 Collections.reverse() 对输入类型的隐含要求和并发下的非原子性 —— 它看起来像一个“安全函数”,但一旦脱离单线程、可变 ArrayList 这个舒适区,问题就会立刻浮现。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

2023.08.21

583

4

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2822

5

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

446

5

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

292

4

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

302

5

Java MyBatis框架
Java MyBatis框架

本专题专注于Java主流ORM框架MyBatis的应用,系统讲解SQL映射、动态SQL、结果映射、分页查询、缓存机制与多表关联等核心内容,并结合企业管理系统、电商平台和后台管理项目实战,帮助学员全面掌握高效的数据库持久层开发技能。

2025.08.26

6169

22

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

2024.05.29

5591

6

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6899

3

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习