Collections
# Collections
Collections
是 JDK 提供的工具类(注意不是 Collection,多了个 s 的),位于 java.util
包中,提供了一系列静态方法,能更方便地操作各种集合。
# 创建空集合
Collections
提供了一系列方法来创建空集合:
- 创建空 List:
List<T> emptyList()
- 创建空 Map:
Map<K, V> emptyMap()
- 创建空 Set:
Set<T> emptySet()
要注意到返回的空集合是不可变集合,无法向其中添加或删除元素。
此外,也可以用各个集合接口提供的 of(T...)
方法创建空集合。例如,以下创建空 List
的两个方法是等价的:
List<String> list1 = List.of();
List<String> list2 = Collections.emptyList();
1
2
2
# 排序
Collections
可以对 List
进行排序。因为排序会直接修改 List
元素的位置,因此必须传入可变 List
:
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("apple");
list.add("pear");
list.add("orange");
// 排序前:
System.out.println(list);
Collections.sort(list);
// 排序后:
System.out.println(list);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 洗牌算法
Collections
提供了洗牌算法,即传入一个有序的 List
,可以随机打乱 List
内部元素的顺序,效果相当于让计算机洗牌:
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for (int i=0; i<10; i++) {
list.add(i);
}
// 洗牌前:
System.out.println(list);
Collections.shuffle(list);
// 洗牌后:
System.out.println(list);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 不可变集合
Collections
还提供了一组方法把可变集合封装成不可变集合:
- 封装成不可变 List:
List<T> unmodifiableList(List<? extends T> list)
- 封装成不可变 Set:
Set<T> unmodifiableSet(Set<? extends T> set)
- 封装成不可变 Map:
Map<K, V> unmodifiableMap(Map<? extends K, ? extends V> m)
这种封装实际上是通过创建一个代理对象,拦截掉所有修改方法实现的。我们来看看效果:
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> mutable = new ArrayList<>();
mutable.add("apple");
mutable.add("pear");
// 变为不可变集合:
List<String> immutable = Collections.unmodifiableList(mutable);
immutable.add("orange"); // UnsupportedOperationException!
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 线程安全集合
Collections
还提供了一组方法,可以把线程不安全的集合变为线程安全的集合:
- 变为线程安全的 List:
List<T> synchronizedList(List<T> list)
- 变为线程安全的 Set:
Set<T> synchronizedSet(Set<T> s)
- 变为线程安全的 Map:
Map<K,V> synchronizedMap(Map<K,V> m)
多线程的概念我们会在后面讲。因为从 Java 5 开始,引入了更高效的并发集合类,所以上述这几个同步方法已经没有什么用了。
# 小结
Collections
类提供了一组工具方法来方便使用集合类:
- 创建空集合;
- 创建单元素集合;
- 创建不可变集合;
- 排序/洗牌等操作。
上次更新: 2024/10/1 18:45:09