collections.swap()仅适用于list接口实现类,不支持数组;用于自定义排序时可简化交换逻辑,自动越界检查、泛型安全、兼容null;原始类型数组需先转为对应泛型list才能使用。

Collections.swap() 不能直接用于数组,它只适用于 List 接口的实现类(如 ArrayList、LinkedList)。如果你在写自定义排序算法(比如冒泡、选择、插入排序),想高效交换两个位置的元素,只要操作的是 List,就可以直接用它——它内部就是通过 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<integer></integer> 才能使用。而 Collections.swap() 对 Integer[] 直接传入会编译失败——因为它的签名是:
public static
- 错误示范:
Collections.swap(myIntArray, 0, 1)→ 编译报错 - 正确做法:
List<integer> list = Arrays.stream(myIntArray).boxed().collect(Collectors.toList());</integer>,再 swap
性能和线程安全提醒
Collections.swap() 时间复杂度是 O(1),底层就是两次 get + 两次 set,没有额外开销。但它不保证线程安全:
- 如果多个线程同时读写同一个 list,需自行同步(例如用
Collections.synchronizedList()包装) - 单线程排序场景下,放心用,比手写三行交换更干净











