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

Collections.swap() 是个典型的“方便但挑食”的工具——它只吃 List 及其实子类(ArrayList、LinkedList 等),对数组理都不理。如果你在手写冒泡、选择或插入排序,操作的刚好是 List,那么直接用 swap() 就行:底层就是通过 set() 和 get() 完成下标交换,简洁又安全,还能自动帮你检查泛型和索引边界。
这是绕不过的前提。如果你手里是 Object[] 或 String[] 这样的数组,Collections.swap() 根本不会接受。必须把它转成 List:
new ArrayList(Arrays.asList(array)) 构建一个可修改的列表——注意:Arrays.asList() 返回的 list 不支持 add/remove,但 swap 是允许的,只是底层数组不能扩容罢了。ArrayList,比如 List list = new ArrayList<>(Arrays.asList(personArray)); 拿冒泡排序举例,传统写法得先搞个临时变量:
Person temp = list.get(i);
list.set(i, list.get(i+1));
list.set(i+1, temp);
换成 Collections.swap(list, i, i+1) 呢?一行就搞定,语义一目了然,还减少了出错的可能性:
IndexOutOfBoundsException)这个坑很多人踩过。比如 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,没有额外开销。但有一点必须说清楚:它不保证线程安全。
Collections.synchronizedList() 包一层。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8