工具类 | 集合工具类Collections介绍

2022年01月15日 阅读数:3
这篇文章主要向大家介绍工具类 | 集合工具类Collections介绍,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

前言

经过本文,你能够学习到 Collections 工具类的一些方法使用,在编码过程当中都是很是实用的。java

引入

CollectionsJDK 提供的工具类,不须要专门引入。web

工具方法介绍

空集合

当一个方法的返回值是集合时,若是返回值为空时,建议不要返回 null,而是返回一个空集合。安全

但若是每次都新建一个 ArrayList 或者 HashMap,则会形成必定的内存浪费,CollectionsListSetMap 等集合类定义了相应的空集合常量。数据结构

// 空 List
Collections.emptyList();
// 空 Set
Collections.emptySet();
// 空 Map
Collections.emptyMap();

空集合使用的单独定义的数据结构,内部不存储数据,因此占用内存是最小的,但也存在一些限制:不可变动,新增、修改、删除元素都会致使异常。ide

一个元素的集合

在工做中常常会碰到这种状况:对方提供的接口须要的是一个集合,但咱们只有一个元素,因而,咱们只得建立一个集合,而后把这个元素加入集合再传过去。一般集合都会预留空间,以备后续还有元素可能加入,但对于只有一个元素的场景则形成了空间浪费,由于不会有后续元素加入。svg

// List
List<String> list = Collections.singletonList("Hello");
// Set
Set<String> set = Collections.singleton("Hello");
// Map
Map<String, Integer> map = Collections.singletonMap("Hello", 100);

与空集合同样,singleton 集合也使用的单独定义的数据结构,内部只存储一个元素,内存占用少,一样不可变动,新增、修改、删除元素都会致使异常。工具

不可变集合

Collections 工具类提供了一系列的 unmodifiableXXX 的方法,用于构建不可变集合,通过此类方法处理后的集合不能够进行新增、修改、删除元素操做,不然会抛出异常。性能

// List
List<String> list = Collections.unmodifiableList(l);
// Set
Set<String> set = Collections.unmodifiableSet(s);
// Map
Map<String, Integer> map = Collections.unmodifiableMap(m);

线程安全集合

Collections 工具类提供了一系列的 synchronizedXXX 的方法,用于构建线程安全集合,通过此类方法处理后的集合能够保证线程安全。可是,这种处理方法通常来讲性能不高,应该优先选择集合类型中的线程安全处理类(好比:ConcurrentHashMap学习

// List
List<String> list = Collections.synchronizedList(l);
// Set
Set<String> set = Collections.synchronizedSet(s);
// Map
Map<String, Integer> map = Collections.synchronizedMap(m);

批量增长

public static void main(String[] args) {
   
   
    List<Integer> list = new ArrayList<>();
    Collections.addAll(list, 1, 2, 3);
    // 输出:[1,2,3]
    System.out.println(list);
}

填充

将集合中的全部元素填充为指定元素。测试

public static void main(String[] args) {
   
   
    List<Integer> list = new ArrayList<>();
    Collections.addAll(list, 1, 2, 3);
    Collections.fill(list, 10);
    // 输出:[10,10,10]
    System.out.println(list);
}

交换位置

public static void main(String[] args) {
   
   
    List<Integer> list = new ArrayList<>();
    Collections.addAll(list, 1, 2, 3);
    Collections.swap(list, 0, 1);
    // 输出:[2,1,3]
    System.out.println(list);
}

排序

public static void main(String[] args) {
   
   
    List<Integer> list = new ArrayList<>();
    Collections.addAll(list, 3, 2, 1);
    Collections.sort(list);
    // 输出:[1,2,3]
    System.out.println(list);
}

也可使用自定义 Comparator 进行排序,好比,下例中使用字符串的长度进行排序。

public static void main(String[] args) {
   
   
    List<String> list = new ArrayList<>();
    Collections.addAll(list, "Hello", "Hi", "H");
    // 输出:[H, Hi, Hello]
    Collections.sort(list, Comparator.comparing(String::length));
    System.out.println(list);
}

直接使用 List.sort() 方法就能够了,Collections.sort 方法没有使用的必要。

逆序

public static void main(String[] args) {
   
   
    List<Integer> list = new ArrayList<>();
    Collections.addAll(list, 3, 2, 1);
    Collections.reverse(list);
    // 输出:[1,2,3]
    System.out.println(list);
}

随机排序

这个方法在测试的时候很是好用。使用 shuffle() 方法进行随机排序,发现每次输出的结果都不同。

public static void main(String[] args) {
   
   
    List<Integer> list = new ArrayList<>();
    Collections.addAll(list, 3, 2, 1);
    Collections.shuffle(list);
    System.out.println(list);
}