java中不存在collections_swap方法,正确的是collections.swap()静态方法,用于原地交换list中指定索引的元素,要求list可修改且支持set操作。

Java 中没有 Collections_swap 方法
Java 标准库中并不存在名为 Collections_swap 的方法。你可能混淆了 Collections.swap()(注意是小写 swap,且是静态方法)和某个自定义工具类、旧文档或拼写错误。实际可用的是 Collections.swap(),它直接操作 List 实例,不返回新列表,也不要求 List 可变 —— 但前提是传入的 List 必须支持 set 操作(即不能是 Arrays.asList() 返回的不可变视图,也不能是 ImmutableList 等)。
Collections.swap() 的正确调用方式
该方法签名是:Collections.swap(List> list, int i, int j)。它原地交换索引 i 和 j 处的元素,不校验索引是否越界 —— 越界会抛出 IndexOutOfBoundsException。
使用时注意以下几点:
-
list必须是可修改的(例如ArrayList、LinkedList),否则运行时报UnsupportedOperationException - 索引
i和j可以相等(无效果),也可以顺序颠倒(swap(list, 2, 5)和swap(list, 5, 2)效果相同) - 无需手动检查
i和j大小关系,方法内部已处理 - 底层通过两次
set()实现:先取get(i),再set(i, get(j)),最后set(j, temp)
示例:
ArrayList<string> list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
Collections.swap(list, 1, 3); // 交换索引1和3 → ["a", "d", "c", "b"]</string>
常见报错及规避方式
最常遇到的两个异常是 UnsupportedOperationException 和 IndexOutOfBoundsException。
UnsupportedOperationException 通常出现在以下情况:
- 用
Arrays.asList("x", "y", "z")得到的 List —— 它不支持set(),因此swap()失败 - Guava 的
ImmutableList或 Collections.unmodifiableList() 包装后的列表
解决办法:确保传入的是可修改的实现,例如:
List<string> mutable = new ArrayList(Arrays.asList("x", "y", "z"));</string>
IndexOutOfBoundsException 发生在任一索引 或 <code>>= list.size()。建议调用前自行校验:
if (i >= 0 && i = 0 && j <h3>替代方案:手写 swap 更可控?</h3> <p>如果你只是偶尔交换、又不想引入 Collections 工具类,或者需要兼容老版本 Android(某些低版本对 Collections 方法支持不稳定),可以直接手写两行:</p> <pre class="brush:php;toolbar:false;">T tmp = list.get(i); list.set(i, list.get(j)); list.set(j, tmp);
这和 Collections.swap() 行为完全一致,但优势在于:你可以加空值判断、类型强转、日志埋点,或封装成泛型方法避免重复代码。不过要注意,如果 list 是 LinkedList,get(i) 是 O(n) 操作,频繁调用性能较差 —— 这种场景更适合用迭代器或专门的节点交换逻辑。
真正容易被忽略的是:无论用哪种方式,都必须确认 List 实现类支持随机访问(RandomAccess)或至少支持 set();否则看似调用成功,实则抛异常或静默失败(比如某些自定义 List 子类未重写 set())。










