【Java】集合工具类 Collections 全方位详解

大家好,我是云扬,今天继续更新 Java 基础干货内容,本篇系统梳理 JDK 自带的java.util.Collections工具类。日常开发中我们经常操作 List、Set、Map 等集合,频繁需要排序、查找、线程安全处理等操作,手动实现繁琐易错,而Collections作为 JDK 原生提供的集合工具,封装了大量静态方法,是开发高频工具。

一、前置导入

Collectionsjava.util包下,使用前必须导包:

import java.util.Collections;
import java.util.ArrayList;
import java.util.List;

二、集合排序相关 API

Collections提供多款针对 List 的排序、调换、打乱方法,日常最常用。

  1. reverse(List<?> list):反转集合元素顺序
  2. shuffle(List<?> list):随机打乱集合顺序(抽奖、随机取值常用)
  3. sort(List<T> list):自然升序排序(元素需要实现 Comparable 接口)
  4. sort(List<T> list, Comparator<? super T> c):自定义比较器排序
  5. swap(List<?> list, int i, int j):交换下标 i、j 位置元素

代码示例:

public class CollectionsSortDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Collections.addAll(list, 3, 1, 9, 5, 2);
        System.out.println("原始集合:" + list);

        // 自然排序
        Collections.sort(list);
        System.out.println("升序排序:" + list);

        // 反转
        Collections.reverse(list);
        System.out.println("反转后:" + list);

        // 随机打乱
        Collections.shuffle(list);
        System.out.println("随机打乱:" + list);

        // 交换下标0和2元素
        Collections.swap(list,0,2);
        System.out.println("交换下标0、2:" + list);
    }
}

三、查找与填充统计 API

包含二分查找、最值获取、元素填充、统计元素出现次数等功能:

  • binarySearch(List<? extends Comparable<? super T>> list, T key):二分查找,前提:集合必须有序
  • max/min(Collection coll):获取集合最大、最小值(自然比较)
  • max/min(Collection coll, Comparator comp):自定义规则获取最值
  • fill(List<? super T> list, T obj):使用同一个对象覆盖集合所有元素
  • frequency(Collection<?> c, Object o):统计指定元素在集合中出现次数

代码示例:

public class CollectionsSearchDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list,"张三","李四","张三","王五");

        // 统计张三出现次数
        int count = Collections.frequency(list,"张三");
        System.out.println("张三出现次数:"+count);

        // 填充全部元素为【测试】
        Collections.fill(list,"测试");
        System.out.println("fill填充后:"+list);

        List<Integer> numList = new ArrayList<>();
        Collections.addAll(numList,12,5,89,22);
        // 获取最大值
        Integer max = Collections.max(numList);
        System.out.println("最大值:"+max);

        // 二分查找前必须排序
        Collections.sort(numList);
        int index = Collections.binarySearch(numList,22);
        System.out.println("22的下标:"+index);
    }
}

注意:binarySearch无序集合查询结果不可靠,找不到元素会返回负数。

四、多线程:同步安全集合

原生 ArrayList、HashMap 是非线程安全集合,多线程并发读写会出现并发异常。Collections.synchronizedXxx()系列方法可以把普通集合包装成同步集合,底层通过synchronized加锁保证线程安全。

  • synchronizedList(List<T> list)
  • synchronizedSet(Set<T> s)
  • synchronizedMap(Map<K,V> m)

示例:

// 将普通ArrayList转为线程安全List
List<String> safeList = Collections.synchronizedList(new ArrayList<>());

原理:包装类中所有集合操作方法都被synchronized修饰,同一时间仅一个线程能操作集合,牺牲部分性能换取线程安全。

五、创建不可变集合

不可变集合初始化后不能新增、删除、修改元素,修改直接抛出UnsupportedOperationException,常用于常量数据存储。

  1. emptyList()/emptySet()/emptyMap():创建空不可变集合
  2. singletonList(T o)/singletonSet(T o):仅存单个元素的不可变集合
  3. unmodifiableList(List<? extends T> list):基于原有集合生成不可变视图

代码示例:

public class UnModifiableDemo {
    public static void main(String[] args) {
        // 单个元素不可变集合
        List<String> singleList = Collections.singletonList("固定参数");
        // singleList.add("新增"); // 报错:不支持修改操作

        List<Integer> src = new ArrayList<>();
        src.add(1);
        List<Integer> unModiList = Collections.unmodifiableList(src);
        // unModiList.add(2); // 运行异常
    }
}

六、其他实用方法

1. addAll 批量添加元素

快速往集合批量插入可变参数元素,替代多次 add 调用:

List<Integer> list = new ArrayList<>();
Collections.addAll(list,10,20,30,40);

2. disjoint(Collection c1,Collection c2)

判断两个集合是否无交集,无交集返回 true,存在相同元素返回 false:

List<Integer> l1 = List.of(1,2,3);
List<Integer> l2 = List.of(4,5,6);
boolean isNoJoin = Collections.disjoint(l1,l2);
System.out.println("是否无交集:"+isNoJoin);

七、拓展:第三方集合工具类

JDK 原生Collections功能有限,项目开发中常用Apache Commons CollectionsSpring CollectionUtils两个第三方工具,补充交集、并集、差集、集合判空等能力。

依赖引入 Maven 坐标(Apache)

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

常用方法示例:

import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
public class ThirdCollectionDemo {
    public static void main(String[] args) {
        List<Integer> list1 = List.of(1,2,3,4);
        List<Integer> list2 = List.of(3,4,5,6);

        // 并集
        CollectionUtils.union(list1,list2);
        // 交集
        CollectionUtils.intersection(list1,list2);
        // 差集 list1独有
        CollectionUtils.subtract(list1,list2);
        // 对称差集(交集以外所有元素)
        CollectionUtils.disjunction(list1,list2);
    }
}

Spring 的org.springframework.util.CollectionUtils更多用于集合判空:CollectionUtils.isEmpty(集合),日常开发判空首选。

结语

Collections是 Java 集合体系必掌握基础工具,熟练使用可以大幅简化集合代码,减少重复造轮子。

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*