商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 怎么利用 Collections.swap() 在自定义排序算法中快速交换数组列表中的两个对象变量

怎么利用 Collections.swap() 在自定义排序算法中快速交换数组列表中的两个对象变量

  发布于2026-07-09 阅读(0)

扫一扫,手机访问

Collections.swap() 只对 List 接口的实现类(比如 ArrayList、LinkedList)有效,数组就别想了。写自定义排序算法时,用它交换元素比手写三行 set/get 要干净得多——自动处理越界检查、泛型安全,连 null 元素也兼容。不过原始类型数组得先转成泛型 List 才能用。

怎么利用 Collections.swap() 在自定义排序算法中快速交换数组列表中的两个对象变量

Collections.swap() 是个典型的“方便但挑食”的工具——它只吃 List 及其实子类(ArrayListLinkedList 等),对数组理都不理。如果你在手写冒泡、选择或插入排序,操作的刚好是 List,那么直接用 swap() 就行:底层就是通过 set() 和 get() 完成下标交换,简洁又安全,还能自动帮你检查泛型和索引边界。

确保你用的是 List 而不是普通数组

这是绕不过的前提。如果你手里是 Object[]String[] 这样的数组,Collections.swap() 根本不会接受。必须把它转成 List

  • 推荐先 new ArrayList(Arrays.asList(array)) 构建一个可修改的列表——注意:Arrays.asList() 返回的 list 不支持 add/remove,但 swap 是允许的,只是底层数组不能扩容罢了。
  • 更稳妥的做法:直接初始化一个真正的 ArrayList,比如 List list = 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 list = Arrays.stream(myIntArray).boxed().collect(Collectors.toList());,然后再调用 swap。

性能和线程安全提醒

Collections.swap() 的时间复杂度是 O(1),底层就是两次 get 加两次 set,没有额外开销。但有一点必须说清楚:它不保证线程安全

  • 如果多个线程同时读写同一个 list,你得像这样自己加同步:用 Collections.synchronizedList() 包一层。
  • 单线程排序场景下,尽管放心用——比手写三行交换清爽多了。
本文转载于:https://www.php.cn/faq/2410095.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注