0

0

Java集合框架中的集合视图与集合反转

P粉602998670

P粉602998670

发布时间:2026-01-05 16:11:03

|

232人浏览过

|

来源于php中文网

原创

集合视图是对底层集合的只读代理,不持有数据副本,操作转发给原集合;修改行为取决于具体实现,可能影响原集合或抛异常,不能等同于安全副本。

java集合框架中的集合视图与集合反转

什么是集合视图(Collection View)?

集合视图不是独立的集合,而是对底层集合的「只读代理」——它不持有数据副本,所有操作都转发给原集合。比如 Collections.unmodifiableList() 返回的列表、Map.keySet() 返回的 SetArrayList.subList() 返回的子列表,都是典型视图。

关键点在于:修改视图可能影响原集合(如 subList),也可能直接抛异常(如 unmodifiableXXX)。不能假设“视图 = 安全副本”。

  • subList(from, to) 返回的视图与原 ArrayList 共享内部数组,调用 set()clear() 会反映到原列表;但 add() / remove() 会抛 UnsupportedOperationException(取决于实现)
  • map.entrySet() 视图中调用 Iterator.remove() 会真实删除原 Map 中的键值对
  • Collections.synchronizedList() 返回的是线程安全的包装器,但它仍是视图——底层仍可被非同步方式访问(比如直接操作原始引用)

Java 中没有内置的「集合反转」方法,但有明确替代方案

别找 reverse()Collection 接口上——它不存在。真正可用的反转能力集中在 List工具类中,且行为差异很大:

  • Collections.reverse(List):就地反转,直接修改原列表(返回 void),要求列表支持随机访问(RandomAccess),否则性能差(如 LinkedList 会遍历一半节点)
  • Lists.reverse(List)(Guava):返回一个不可变的视图,原列表不变;底层用索引倒查,不复制元素
  • new ArrayList(original).reversed()(Java 21+ SequencedCollection):仅适用于实现了该接口的集合(如 ArrayListLinkedList),返回新实例,非视图
  • Stream:可用 Collectors.collectingAndThen(..., Collections::reverse),但需注意这是收集后反转,不是流式延迟处理

常见错误:对 SetMap 直接调用 reverse() —— 编译不过,因为它们不保证顺序,也就谈不上“反转”。若需要有序结果,先转成 List 再反转。

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

恒浪威购商城
恒浪威购商城

基于asp.net2.0框架技术与企业级分布式框架以及与 ms sql server 2000数据库无缝集合而成,并且融合当前流行的ajax技术进行编写的电子商务系统,她整合了多用户商城、单用户商城功能和恒浪网站整合管理系统,吸收绝大部分同类产品的精华和优点,独创网络团购(b2t)电子商务模式,流程化的团购功能和视频导购等功能,是一款极具商业价值的电子商务系统。商城前台功能概述:商城会员可前台自行

下载

视图 + 反转组合使用时的坑

把视图和反转混用极易引发 ConcurrentModificationException 或意外副作用。例如:

List<String> original = new ArrayList<>(Arrays.asList("a", "b", "c"));
List<String> view = original.subList(0, 2); // ["a", "b"]
Collections.reverse(view); // 原列表变成 ["b", "a", "c"] —— 是的,真改了

再比如:

List<String> unmod = Collections.unmodifiableList(original);
Collections.reverse(unmod); // 运行时报 UnsupportedOperationException
  • 视图是否支持修改,取决于其具体类型和创建方式,和“是不是视图”无必然关系
  • 反转操作是否生效,取决于目标对象是否实现了 List 且底层支持写入(如 Arrays.asList() 返回的列表可 set(),但不能 add()
  • Guava 的 Lists.reverse() 是安全的视图,但它的迭代器不支持 remove(),强行调用会抛 UnsupportedOperationException

什么时候该用视图,什么时候该复制?

视图省内存、响应快,但耦合深;复制断开依赖,但代价明确。选哪个,看场景:

  • 只读遍历且原集合生命周期可控 → 用 unmodifiableXXXsubList
  • 要传给不可信代码(比如第三方库回调)→ 必须复制,避免对方误改你的数据
  • 频繁反转且后续还要多次读取 → 用 Collections.reverse() 就地改(如果允许修改原集合),比反复新建反转副本更高效
  • 需要反转后还能增删 → 不能用任何视图反转,必须构造新 ArrayList 并手动填充(或用 Java 21+ 的 reversed()

最易被忽略的一点:subList 返回的视图在原列表结构变更(如 clear()ensureCapacity() 引发扩容)后,可能失效并抛 ConcurrentModificationException,哪怕你没并发线程——这是 fail-fast 机制在起作用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
guava包作用
guava包作用

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

271

2024.05.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

134

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1902

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2387

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.1万人学习

Java 教程
Java 教程

共578课时 | 80.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号