java中arraylist无内置交换方法,但可用get()和set()配合临时变量实现;推荐使用collections.swap(),它语义明确、安全可靠。

Java 中的 ArrayList 本身没有直接提供“交换两个位置元素”的内置方法,但可以通过索引访问和临时变量轻松实现。核心思路是:先读取两个位置的值,再用临时变量暂存其中一个,最后按顺序赋值。
使用 get() 和 set() 手动交换
这是最常用、最直观的方式,适用于任意两个合法索引(需确保不越界):
- 调用
list.get(i)获取第 i 个元素 - 调用
list.get(j)获取第 j 个元素 - 用一个临时变量保存其中一个值(比如
temp = list.get(i)) - 用
set()将 j 位置的值放到 i 位置,再把 temp 放到 j 位置
示例代码:
ArrayList<string> list = new ArrayList(Arrays.asList("A", "B", "C", "D"));
int i = 0, j = 2;
// 安全检查(建议加上)
if (i = list.size() || j = list.size()) {
throw new IndexOutOfBoundsException("索引超出范围");
}
String temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
// 结果:["C", "B", "A", "D"]
</string>
封装成通用工具方法
为避免重复写交换逻辑,可封装为静态方法,支持任意泛型类型:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public static <t> void swap(ArrayList<t> list, int i, int j) {
if (list == null || i = list.size() || j >= list.size()) {
throw new IllegalArgumentException("无效索引或列表为空");
}
T temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
</t></t>
调用时直接传入列表和两个索引即可,清晰又复用性强。
注意点:避免常见错误
-
不检查索引边界:直接操作可能抛出
IndexOutOfBoundsException - 误用 add() 替代 set():add() 会插入并移动后续元素,不是原地交换
- 对 null 元素处理不当:如果列表允许 null,临时变量可以是 null,不影响逻辑;但若后续有判空逻辑,需自行考虑
- 并发场景不安全:ArrayList 非线程安全,多线程交换需额外同步
替代方案:Collections.swap()(推荐)
其实 Java 已经提供了标准解法:Collections.swap(list, i, j)。它内部就是用类似上面的 get/set + 临时变量实现的,且做了边界检查:
Collections.swap(list, 0, 2); // 一行搞定,简洁可靠
这是官方推荐方式,语义明确、经过充分测试,无需自己重复造轮子。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










