最直接的方式是使用Collections.swap()方法。它接受列表和两个索引,直接在原列表上交换元素,代码简洁、安全且可读性强,相比手动交换更推荐使用。

在Java中,想要交换列表中两个指定位置的元素,最直接、最优雅的方式就是使用
java.util.Collections
swap()
Collections.swap()
List<?> list
int i
int j
i
j
下面是一个简单的例子,展示了如何使用它:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ElementSwapExample {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Date");
System.out.println("原始列表: " + fruits); // 原始列表: [Apple, Banana, Cherry, Date]
// 交换索引为 0 和 2 的元素
Collections.swap(fruits, 0, 2);
System.out.println("交换后列表: " + fruits); // 交换后列表: [Cherry, Banana, Apple, Date]
// 再次交换,这次交换索引为 1 和 3 的元素
Collections.swap(fruits, 1, 3);
System.out.println("再次交换后列表: " + fruits); // 再次交换后列表: [Cherry, Date, Apple, Banana]
}
}从输出你可以清楚地看到,
Apple
Cherry
Banana
Date
立即学习“Java免费学习笔记(深入)”;
在Java中,当你需要交换列表中的两个元素时,你当然可以手动写一段代码,比如这样:
// 手动交换的例子 String temp = list.get(i); list.set(i, list.get(j)); list.set(j, temp);
这段代码本身并没有错,在很多场景下也完全能工作。但从我个人的开发经验来看,
Collections.swap()
首先是简洁性。一行代码就能完成的任务,为什么还要写三行?这不仅仅是字符数量的减少,更是思维负担的减轻。当你阅读代码时,一眼看到
Collections.swap()
其次是健壮性。
Collections.swap()
List
ArrayList
get/set
i
j
Collections.swap()
IndexOutOfBoundsException
再者,它体现了意图的表达。当一个方法名清晰地描述了它的功能时,代码的可读性会大大提升。
swap
Collections.swap()
get/set
我个人觉得,写代码追求的不仅仅是功能实现,更是可读性和维护性。
Collections.swap
尽管
Collections.swap()
最常见也是最直接的一个问题就是索引越界(IndexOutOfBoundsException
i
j
Collections.swap()
IndexOutOfBoundsException
List<String> items = new ArrayList<>(List.of("A", "B", "C"));
try {
Collections.swap(items, 0, 5); // 列表大小只有3,索引5越界
} catch (IndexOutOfBoundsException e) {
System.err.println("错误:尝试交换的索引超出列表范围!" + e.getMessage());
}在实际开发中,尤其当索引值来源于用户输入或者其他动态计算时,务必进行边界检查,比如
if (i >= 0 && i < list.size() && j >= 0 && j < list.size())
另一个需要理解的特性是,
Collections.swap()
List
List<String> originalList = new ArrayList<>(List.of("X", "Y", "Z"));
List<String> copyList = new ArrayList<>(originalList); // 创建副本
Collections.swap(copyList, 0, 1);
System.out.println("原始列表: " + originalList); // 原始列表: [X, Y, Z]
System.out.println("副本列表: " + copyList); // 副本列表: [Y, X, Z]这并不是一个“陷阱”,而是方法设计上的一个基本特点,但如果对这一点不清楚,可能会导致一些逻辑上的错误。
再来就是线程安全问题。
Collections.swap()
List
Collections.synchronizedList()
synchronized
ReentrantLock
// 示例:非线程安全列表在多线程环境下的潜在问题
// 假设有一个共享的ArrayList
List<Integer> sharedList = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// 如果多个线程同时调用 Collections.swap(sharedList, i, j);
// 而没有同步机制,可能会导致不可预测的结果或ConcurrentModificationException
// 正确的做法是:
// List<Integer> synchronizedList = Collections.synchronizedList(new ArrayList<>(List.of(1, 2, 3, 4, 5)));
// synchronized (synchronizedList) {
// Collections.swap(synchronizedList, i, j);
// }理解这些注意事项,能帮助我们更安全、更有效地使用
Collections.swap()
java.util.Collections
swap()
List
Collections.reverse(List<?> list)
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5));
Collections.reverse(numbers);
System.out.println("反转后: " + numbers); // 反转后: [5, 4, 3, 2, 1]Collections.shuffle(List<?> list)
shuffle()
Random
List<String> cards = new ArrayList<>(List.of("A", "K", "Q", "J", "10"));
Collections.shuffle(cards);
System.out.println("洗牌后: " + cards); // 每次运行结果可能不同,例如: [J, 10, A, K, Q]Collections.rotate(List<?> list, int distance)
List<String> weekdays = new ArrayList<>(List.of("Mon", "Tue", "Wed", "Thu", "Fri"));
Collections.rotate(weekdays, 2); // 向右旋转2位
System.out.println("旋转后: " + weekdays); // 旋转后: [Thu, Fri, Mon, Tue, Wed]Collections.sort(List<T> list)
Collections.sort(List<T> list, Comparator<? super T> c)
Comparable
Comparator
List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
Collections.sort(names);
System.out.println("排序后: " + names); // 排序后: [Alice, Bob, Charlie]
List<Integer> unsortedNums = new ArrayList<>(List.of(5, 1, 4, 2, 8));
Collections.sort(unsortedNums, (a, b) -> b - a); // 降序排序
System.out.println("降序排序后: " + unsortedNums); // 降序排序后: [8, 5, 4, 2, 1]这些方法,就像是Java为我们准备的一套精良工具,让你不必每次都从零开始造轮子。它们不仅功能强大,而且经过高度优化,能够以高效且安全的方式处理各种列表操作。当你需要对列表进行任何形式的修改或查询时,不妨先去
Collections
以上就是如何在Java中使用Collections.swap交换元素的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号