【Java】集合工具类 Collections 全方位详解
大家好,我是云扬,今天继续更新 Java 基础干货内容,本篇系统梳理 JDK 自带的java.util.Collections工具类。日常开发中我们经常操作 List、Set、Map 等集合,频繁需要排序、查找、线程安全处理等操作,手动实现繁琐易错,而Collections作为 JDK 原生提供的集合工具,封装了大量静态方法,是开发高频工具。
一、前置导入
Collections在java.util包下,使用前必须导包:
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
二、集合排序相关 API
Collections提供多款针对 List 的排序、调换、打乱方法,日常最常用。
reverse(List<?> list):反转集合元素顺序shuffle(List<?> list):随机打乱集合顺序(抽奖、随机取值常用)sort(List<T> list):自然升序排序(元素需要实现 Comparable 接口)sort(List<T> list, Comparator<? super T> c):自定义比较器排序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,常用于常量数据存储。
emptyList()/emptySet()/emptyMap():创建空不可变集合singletonList(T o)/singletonSet(T o):仅存单个元素的不可变集合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 Collections、Spring 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 集合体系必掌握基础工具,熟练使用可以大幅简化集合代码,减少重复造轮子。



