讲师中心 微信公众号
AI工具推荐 视频效率加速

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

千丽酱_7730

千丽酱_7730

发布时间:2026-01-13 11:30:09

|

996人浏览过

|

来源于php中文网

原创

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<user></user> 可能为 null(尤其 MyBatis 某些配置下未设默认返回空集合)。

立即学习“Java免费学习笔记(深入)”;

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

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

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

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

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

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

  • 推荐副本方案(Java 10+):
    List<String> reversed = new ArrayList<>(original);
    Collections.reverse(reversed);
  • Stream 方案(需反转索引):
    List<String> reversed = IntStream.range(0, original.size())
        .mapToObj(i -> original.get(original.size() - 1 - i))
        .collect(Collectors.toList());
  • 注意: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 这个舒适区,问题就会立刻浮现。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

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

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

583

2023.08.21

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

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

2802

2024.02.23

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

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

446

2024.02.23

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

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

292

2024.02.23

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

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

302

2024.02.23

Java MyBatis框架
Java MyBatis框架

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

6169

2025.08.26

guava包作用
guava包作用

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

5571

2024.05.29

string转int
string转int

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

6879

2023.08.02

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn