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

前言

通过本文,你可以学习到 Collections 工具类的一些方法使用,在编码过程中都是非常实用的。

引入

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

工具方法介绍

空集合

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

但如果每次都新建一个 ArrayList 或者 HashMap,则会造成一定的内存浪费,CollectionsListSetMap 等集合类定义了相应的空集合常量。

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

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

一个元素的集合

在工作中经常会碰到这种情况:对方提供的接口需要的是一个集合,但我们只有一个元素,于是,我们只得创建一个集合,然后把这个元素加入集合再传过去。通常集合都会预留空间,以备后续还有元素可能加入,但对于只有一个元素的场景则造成了空间浪费,因为不会有后续元素加入。

// 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);
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值