Collections.swap用于交换列表中两位置元素,简化手动交换操作。它直接修改原列表,适用于排序、洗牌等场景,但需注意索引越界、不可修改列表异常、LinkedList性能差及线程不安全问题。替代方案包括临时变量法(直观但冗长)和set返回值法(简洁但难读),推荐Collections.swap以平衡可读性与简洁性。

Java里,
Collections.swap
Collections.swap
public static void swap(List<?> list, int i, int j)
List
i
j
看个例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class SwapExample {
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的元素 (即 "Apple" 和 "Cherry")
Collections.swap(fruits, 0, 2);
System.out.println("交换后列表: " + fruits); // 输出: [Cherry, Banana, Apple, Date]
// 交换索引为1和3的元素 (即 "Banana" 和 "Date")
Collections.swap(fruits, 1, 3);
System.out.println("再次交换后列表: " + fruits); // 输出: [Cherry, Date, Apple, Banana]
}
}这个方法会直接修改传入的
List
在我看来,
Collections.swap
比如,在一些经典的排序算法实现中,比如冒泡排序(Bubble Sort)或者选择排序(Selection Sort),核心操作就是不断地交换元素位置。虽然现代Java开发中我们更多会用
Collections.sort
Collections.swap
另一个常见的应用场景是列表的随机化(Shuffling)。虽然
Collections.shuffle
swap
Collections.swap
此外,在一些数据处理或UI交互的场景中,比如用户拖拽列表项来调整顺序,后端接收到新的顺序后,可能需要对原始数据列表进行相应的调整。或者,在某些算法中,需要将特定条件的元素移动到列表的某个位置,通过多次交换也可以达到目的。我个人在处理一些需要快速原型验证的列表操作时,也倾向于用它,因为它的意图非常明确。
尽管
Collections.swap
首先,也是最常见的,就是索引越界问题。如果你传入的
i
j
0
list.size() - 1
IndexOutOfBoundsException
其次,
Collections.swap
Collections.unmodifiableList()
swap
Arrays.asList()
UnsupportedOperationException
再来谈谈性能。
Collections.swap
list.set(index, element)
ArrayList
swap
LinkedList
list.set(index, element)
LinkedList
swap
最后,一个比较隐晦的点是线程安全。
Collections.swap
swap
synchronized
Collections.synchronizedList()
当然,
Collections.swap
最“原始”的方式,也是我们学习编程时最早接触的,就是手动使用一个临时变量进行交换。
List<String> items = new ArrayList<>(List.of("A", "B", "C"));
System.out.println("原始: " + items); // [A, B, C]
int i = 0;
int j = 2;
// 手动交换
String temp = items.get(i);
items.set(i, items.get(j));
items.set(j, temp);
System.out.println("手动交换后: " + items); // [C, B, A]这种方法的优点是非常直观,易于理解,并且你对整个交换过程有完全的控制。它不依赖任何
Collections
get()
set()
Collections.swap
另一种稍微“巧妙”一点的方法是利用List.set()
list.set(index, element)
List<String> items2 = new ArrayList<>(List.of("X", "Y", "Z"));
System.out.println("原始2: " + items2); // [X, Y, Z]
int i2 = 0;
int j2 = 2;
// 利用set方法返回值交换
items2.set(i2, items2.set(j2, items2.get(i2)));
System.out.println("利用set交换后2: " + items2); // [Z, Y, X]这种方法的优点是非常紧凑,一行代码就能搞定。它避免了显式声明临时变量,看起来很“酷”。然而,它的可读性是最大的短板。对于不熟悉这种写法的开发者来说,理解这行代码的逻辑可能需要一点时间,因为它有点像一个嵌套的赋值操作。在团队协作或者代码维护时,这可能成为一个障碍。
综合来看,我个人还是倾向于在大多数情况下使用
Collections.swap
Collections
Collections
set
以上就是Collections.swap方法使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号