怎么利用 Collections.swap() 在自定义排序算法中快速交换数组列表中的两个对象变量
作者:NorthPath
时间:2026-07-09
浏览:0
Collections.swap() 只对 List 接口的实现类(比如 ArrayList、LinkedList)有效,数组就别想了。写自定义排序算法时,用它交换元素比手写三行 set/get 要干净得多——自动处理越界检查、泛型安全,连 null 元素也兼容。不过原始类型数组得先转成泛型 Lis
Collections.swap() 只对 List 接口的实现类(比如 ArrayList、LinkedList)有效,数组就别想了。写自定义排序算法时,用它交换元素比手写三行 set/get 要干净得多——自动处理越界检查、泛型安全,连 null 元素也兼容。不过原始类型数组得先转成泛型 List 才能用。

Collections.swap() 是个典型的“方便但挑食”的工具——它只吃 List 及其实子类(ArrayList、LinkedList 等),对数组理都不理。如果你在手写冒泡、选择或插入排序,操作的刚好是 List,那么直接用 swap() 就行:底层就是通过 set() 和 get() 完成下标交换,简洁又安全,还能自动帮你检查泛型和索引边界。
确保你用的是 List 而不是普通数组
这是绕不过的前提。如果你手里是 Object[] 或 String[] 这样的数组,Collections.swap() 根本不会接受。必须把它转成 List:
- 推荐先
new ArrayList(Arrays.asList(array))构建一个可修改的列表——注意:Arrays.asList()返回的 list 不支持 add/remove,但 swap 是允许的,只是底层数组不能扩容罢了。 - 更稳妥的做法:直接初始化一个真正的
ArrayList,比如Listlist = new ArrayList<>(Arrays.asList(personArray));
在自定义排序中直接调用 swap() 替代手动赋值
拿冒泡排序举例,传统写法得先搞个临时变量:
Person temp = list.get(i);
list.set(i, list.get(i+1));
list.set(i+1, temp);
换成 Collections.swap(list, i, i+1) 呢?一行就搞定,语义一目了然,还减少了出错的可能性:
- 自动校验索引是否越界(越界就抛
IndexOutOfBoundsException) - 泛型类型编译器帮你兜底,完全安全
- null 元素也照常处理,不会报错
注意它不适用于原始类型数组或基本类型包装类的“伪数组”场景
这个坑很多人踩过。比如 int[] 或 Integer[] 数组,必须老老实实先转成 List 才能用。而 Collections.swap() 的签名是:
public static void swap(List list, int i, int j)
- 错误用法:
Collections.swap(myIntArray, 0, 1)—— 编译就直接报错。 - 正确做法:
List,然后再调用 swap。list = Arrays.stream(myIntArray).boxed().collect(Collectors.toList());
性能和线程安全提醒
Collections.swap() 的时间复杂度是 O(1),底层就是两次 get 加两次 set,没有额外开销。但有一点必须说清楚:它不保证线程安全。
- 如果多个线程同时读写同一个 list,你得像这样自己加同步:用
Collections.synchronizedList()包一层。 - 单线程排序场景下,尽管放心用——比手写三行交换清爽多了。
作者最新文章
贵州省住建厅与贝壳集团签署旅居战略合作:五大维度落地方案解析
2026-09-08 18:13
上海链家安住APP:业主主动卖房功能与成交数据解析
2026-09-08 18:11
如何批量将PPT转成PDF格式?PPT转PDF工具怎么选?
2026-09-04 16:03
PDF文件怎么压缩?3个小技巧帮你减小体积
2026-09-03 18:03
小批量试产总结报告:新产品量产导入评审实战指南
2026-09-02 19:48
上一篇:
golang库怎么读
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































