JavaCollections.swap使用技巧分享
时间:2026-03-23 10:06:48 331浏览 收藏
Java的Collections.swap看似简单,实则暗藏多重陷阱:它无法用于Arrays.asList返回的固定大小列表、不校验索引合法性、在泛型擦除下易引发类型安全问题,且与不可变列表或高开销并发列表(如CopyOnWriteArrayList)兼容性差;真正关键的不是“怎么调用swap”,而是先确认你的List是否真正支持set操作——多数bug根源在于上游构造方式不当,而非swap本身写错。

为什么 Collections.swap 不能交换 Arrays.asList 返回的列表?
因为 Arrays.asList 返回的是一个固定大小的、不支持结构性修改的列表实现(Arrays$ArrayList),而 Collections.swap 内部会尝试调用 set 方法——这在该实现中会抛出 UnsupportedOperationException。
- 常见错误现象:
Exception in thread "main" java.lang.UnsupportedOperationException - 使用场景:你用
String[] arr = {"a","b","c"};转成List后直接 swap,就踩坑了 - 解决办法:包装一层可变列表,比如
new ArrayList(Arrays.asList(...)) - 性能影响:多一次构造,但只在初始化时发生,无运行时开销
Collections.swap 的索引越界行为和安全边界
它不会做任何索引检查,传入负数或超出 list.size() 的索引,会在内部调用 get 或 set 时直接抛出 IndexOutOfBoundsException —— 和你手动 get/set 一样。
- 容易踩的坑:误以为 swap 会自动校验或静默忽略非法索引
- 建议做法:调用前自己判断
i >= 0 && i = 0 && j - 参数差异:两个索引顺序无关,
swap(list, 0, 2)和swap(list, 2, 0)效果完全相同
替代方案:手写 swap 时要注意泛型擦除陷阱
如果你绕过 Collections.swap 自己写,比如用临时变量 + set,得小心泛型类型安全问题。尤其在方法签名里用了通配符或原始类型时,编译器可能放行但运行时报错。
- 典型错误代码:
List> list = new ArrayList—— 编译失败,因为(); swap(list, 0, 1); ?不允许set - 正确写法:确保列表是具体泛型类型,如
List;或用Object临时变量(但丢失类型信息) - 示例安全写法:
public static <T> void swap(List<T> list, int i, int j) {<br> T tmp = list.get(i);<br> list.set(i, list.get(j));<br> list.set(j, tmp);<br>}
不可变列表、并发列表等特殊实现的兼容性
Collections.swap 本质依赖 get + set,所以只要列表实现了这两个方法且允许修改,它就能工作;否则就会失败。
- 明确不支持:所有
Collections.unmodifiable*系列返回的视图、List.of()(Java 9+)、Guava 的ImmutableList - 需注意并发安全:对
CopyOnWriteArrayList可以用,但每次set都触发复制,高频 swap 会显著拖慢性能 - 推荐判断方式:看文档是否声明 “supports the set operation” —— 这是 JDK Javadoc 中的明确判定依据
以上就是《JavaCollections.swap使用技巧分享》的详细内容,更多关于的资料请关注golang学习网公众号!
相关阅读
更多>
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
最新阅读
更多>
-
466 收藏
-
151 收藏
-
368 收藏
-
285 收藏
-
289 收藏
-
147 收藏
-
273 收藏
-
254 收藏
-
481 收藏
-
108 收藏
-
322 收藏
-
139 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习