Collections

Collections是JDK提供的工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合。

创建空集合

Collections提供了一系列方法来创建空集合:

  • 创建空List:List<T> emptyList()
  • 创建空Map:Map<K, V> emptyMap()
  • 创建空Set:Set<T> emptySet()

要注意到返回的空集合是不可变集合,无法向其中添加或删除元素。
此外,也可以用各个集合接口提供的of(T...)方法创建空集合。

创建单元素集合

Collections提供了一系列方法来创建一个单元素集合:

  • 创建一个元素的List:List<T> singletonList(T o)
  • 创建一个元素的Map:Map<K, V> singletonMap(K key, V value)
  • 创建一个元素的Set:Set<T> singleton(T o)

要注意到返回的单元素集合也是不可变集合,无法向其中添加或删除元素。
此外,也可以用各个集合接口提供的of(T...)方法创建单元素集合
实际上,使用List.of(T...)更方便,因为它既可以创建空集合,也可以创建单元素集合,还可以创建任意个元素的集合。注:of()方法创建的也是不可变集合

排序

  1. public class Main {
  2. public static void main(String[] args) {
  3. List<String> list = new ArrayList<>();
  4. list.add("apple");
  5. list.add("pear");
  6. list.add("orange");
  7. // 排序前:
  8. System.out.println(list);
  9. Collections.sort(list);
  10. // 排序后:
  11. System.out.println(list);
  12. }
  13. }

洗牌

  1. public class Main {
  2. public static void main(String[] args) {
  3. List<Integer> list = new ArrayList<>();
  4. for (int i=0; i<10; i++) {
  5. list.add(i);
  6. }
  7. // 洗牌前:
  8. System.out.println(list);
  9. Collections.shuffle(list);
  10. // 洗牌后:
  11. System.out.println(list);
  12. }
  13. }

不可变集合

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)

这种封装实际上是通过创建一个代理对象,拦截掉所有修改方法实现的。我们来看看效果:

  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. List<String> mutable = new ArrayList<>();
  5. mutable.add("apple");
  6. mutable.add("pear");
  7. // 变为不可变集合:
  8. List<String> immutable = Collections.unmodifiableList(mutable);
  9. immutable.add("orange"); // No thronw UnsupportedOperationException!
  10. mutable.add("orange"); // Yes
  11. }
  12. }

然而,继续对原始的可变List进行增删是可以的,并且,会直接影响到封装后的“不可变”List。因此,如果我们希望把一个可变List封装成不可变List,那么,返回不可变List后,最好立刻扔掉可变List的引用,这样可以保证后续操作不会意外改变原始对象,从而造成“不可变”List变化了

线程安全集合

Collections还提供了一组方法,可以把线程不安全的集合变为线程安全的集合:

  • 变为线程安全的List:List<T> synchronizedList(List<T> list)
  • 变为线程安全的Set:Set<T> synchronizedSet(Set<T> s)
  • 变为线程安全的Map:Map<K,V> synchronizedMap(Map<K,V> m)