Java集合工具类与Hutool实战指南
Collections 类深度解析
类定位与特性
Collections 是 Java 集合框架的核心工具类,专门提供静态方法对集合对象进行操作。作为集合的"大管家",它与 Arrays 互补——后者处理数组,前者处理 Collection 体系(包括 List、Set、Map 等)。该类所有方法均为静态方法,无需实例化即可调用,核心功能涵盖排序、查找、同步控制及不可变集合创建等场景。
核心方法体系
排序与交换操作
集合排序是高频需求,Collections 提供了丰富的排序方法:
| 方法签名 | 作用描述 |
|---|---|
reverse(List list) |
将列表内元素顺序完全颠倒 |
shuffle(List list) |
随机打乱元素顺序(类似扑克牌洗牌) |
sort(List list) |
按自然升序排列元素 |
sort(List list, Comparator c) |
按指定比较规则排序 |
swap(List list, int i, int j) |
交换指定索引位置的元素 |
实际应用示例:
List<Integer> numbers = new ArrayList<>(Arrays.asList(5, 2, 8, 1, 9));
Collections.reverse(numbers);
Collections.shuffle(numbers);
Collections.sort(numbers);
Collections.sort(numbers, Comparator.reverseOrder());
Collections.swap(numbers, 0, numbers.size() - 1);
查找与统计功能
二分查找要求集合预先排序,否则结果不确定:
| 方法 | 功能说明 |
|---|---|
binarySearch(List list, Object key) |
二分查找目标元素(需先排序) |
max(Collection coll) / min(Collection coll) |
获取最大/最小元素 |
max(Collection coll, Comparator comp) |
按自定义规则获取极值 |
fill(List list, Object obj) |
用指定对象填充集合所有位置 |
frequency(Collection c, Object o) |
统计元素出现频次 |
使用示例:
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie", "Alice"));
Collections.sort(names);
int pos = Collections.binarySearch(names, "Bob");
String max = Collections.max(names);
int count = Collections.frequency(names, "Alice");
线程安全包装
JDK 早期通过同步包装器为集合提供线程安全能力:
| 方法 | 返回类型 | 用途 |
|---|---|---|
synchronizedList(List list) |
List |
返回同步列表 |
synchronizedSet(Set set) |
Set |
返回同步集合 |
synchronizedMap(Map map) |
Map |
返回同步映射 |
典型用法:
List<String> threadSafeList = Collections.synchronizedList(new ArrayList<>());
Set<Integer> threadSafeSet = Collections.synchronizedSet(new HashSet<>());
Map<String, Object> threadSafeMap = Collections.synchronizedMap(new HashMap<>());
现代开发推荐使用
java.util.concurrent包下的并发集合类,如CopyOnWriteArrayList、ConcurrentHashMap、ConcurrentLinkedQueue等,它们采用更高效的锁策略或无锁设计。
不可变集合创建
不可变集合在安全发布和防御性编程中非常重要:
| 方法 | 作用 |
|---|---|
emptyList() / emptySet() / emptyMap() |
返回空不可变集合 |
singletonList(T o) / singletonMap(K, V) |
返回单元素不可变集合 |
unmodifiableList(List list) |
包装现有集合为只读视图 |
示例:
List<String> immutable = Collections.emptyList();
// 下面一行将抛出 UnsupportedOperationException
immutable.add("test");
List<String> readOnly = Collections.unmodifiableList(new ArrayList<>());
其他实用方法
Collections.addAll(fruits, "Apple", "Banana", "Orange");
boolean hasOverlap = Collections.disjoint(listA, listB);
扩展工具类:CollectionUtils
除 JDK 原生 Collections 外,Spring 和 Apache Commons 提供了功能更强大的集合工具类。
Spring CollectionUtils
位于 org.springframework.util.CollectionUtils,主要方法:
isEmpty(collection)/isNotEmpty(collection)— 判断集合是否为空(同时兼容 null)
Apache Commons CollectionUtils
位于 org.apache.commons.collections4.CollectionUtils,提供集合运算能力:
| 方法 | 功能 |
|---|---|
isEmpty(coll) / isNotEmpty(coll) |
空值判断 |
union(a, b) |
并集 |
intersection(a, b) |
交集 |
disjunction(a, b) |
对称差集 |
subtract(a, b) |
差集(a - b) |
使用示例:
List<Integer> a = Arrays.asList(1, 2, 3, 4);
List<Integer> b = Arrays.asList(3, 4, 5, 6);
Collection<Integer> unionResult = CollectionUtils.union(a, b);
Collection<Integer> interResult = CollectionUtils.intersection(a, b);
Collection<Integer> diffResult = CollectionUtils.subtract(a, b);
| 类别 | 核心方法 | 用途 |
|---|---|---|
| 排序 | reverse、shuffle、sort、swap |
元素顺序操作 |
| 查找 | max、min、binarySearch、frequency、fill |
元素检索统计 |
| 同步 | synchronizedList、synchronizedMap |
线程安全包装 |
| 不可变 | emptyList、singletonList、unmodifiableList |
只读集合创建 |
| 扩展 | addAll、disjoint |
集合批量操作 |
Hutool 工具库详解

工具库概述
Hutool(谐音"糊涂")是国产 Java 工具类库的优秀代表,核心理念是减少重复代码、提供通用封装,让项目中的 util 包更加精简。版本迭代活跃,API 设计友好,是国内 Java 项目中应用广泛的工具类。
快速引入
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
核心模块详解
类型转换(Convert)
统一简化类型转换操作,支持字符串与常见类型互转:
int num = Convert.toInt("123", 0);
double price = Convert.toDouble("99.99");
Date date = Convert.toDate("2024-01-15");
String hex = Convert.toHex(new byte[]{1, 2, 3});
日期时间(DateUtil)
比 JDK Date 和 Calendar 更易用的日期处理工具:
Date now = DateUtil.date();
Date parsed = DateUtil.parse("2024-06-20");
String formatted = DateUtil.format(date, "yyyy年MM月dd日");
long diffMs = DateUtil.between(start, end, DateUnit.MS);
IO 与文件(IoUtil、FileUtil)
封装文件读写、流转操作:
String content = FileUtil.readUtf8String(new File("config.txt"));
IoUtil.copy(inputStream, outputStream);
File file = FileUtil.touch("newFile.txt");
字符串工具(StrUtil)
继承自 StringUtils,增强字符串处理:
String result = StrUtil.format("{}你好,欢迎使用{}", "用户", "Hutool");
boolean blank = StrUtil.isBlank(str);
String trimmed = StrUtil.trim(" hello ");
反射工具(ReflectUtil)
简化反射调用:
Object obj = ReflectUtil.newInstance(MyClass.class);
Method method = ReflectUtil.getMethod(obj, "doSomething");
Object result = ReflectUtil.invoke(obj, method, params);
压缩解压(ZipUtil)
一行代码完成压缩:
ZipUtil.zip("sourceFolder", "output.zip");
ZipUtil.unzip("archive.zip", "targetFolder");
身份证验证(IdcardUtil)
支持大陆、港澳台身份证格式校验:
boolean valid = IdcardUtil.isValidCard("110101199001011234");
String province = IdcardUtil.getProvinceByIdCard(idCard);
动态字典(Dict)
支持灵活类型键的 Map 实现:
Dict data = Dict.create()
.set("username", "admin")
.set("age", 30)
.set("active", true);
String name = data.getStr("username");
Integer age = data.getInt("age");
控制台输出(Console)
类似 JavaScript 的调试打印:
Console.log("执行结果: {}", result);
Console.error("错误信息: {}", errorMsg);
数据校验(Validator)
常用格式验证:
boolean isEmail = Validator.isEmail("test@domain.com");
boolean isMobile = Validator.isMobile("13800138000");
boolean isIp = Validator.isIp("192.168.1.1");
双向映射(BiMap)
支持正反双向查找:
BiMap<String, Integer> biMap = new BiMap<>();
biMap.put("one", 1);
biMap.put("two", 2);
Integer val = biMap.get("one"); // 1
String key = biMap.getKey(1); // "one"
图片处理(ImgUtil)
基本图像操作:
File original = new File("photo.jpg");
ImgUtil.scale(original, new File("thumb.jpg"), 0.5f);
ImgUtil.pressText(original, "水印文字", Color.RED);
配置文件(Setting)
支持中文键的配置文件读取:
Setting config = new Setting("app.setting");
String value = config.getStr("database.url");
日志抽象(LogFactory)
统一日志门面,兼容多种实现:
Log log = LogFactory.get();
log.info("应用启动");
log.error("操作失败", exception);
缓存实现(CacheUtil)
多种缓存策略:
Cache<String, User> cache = CacheUtil.newFIFOCache(100);
cache.put("user:1", user1);
User cached = cache.get("user:1");
加密工具(SecureUtil)
常用加密算法封装:
AES aes = SecureUtil.aes(key.getBytes());
String encrypted = aes.encryptHex(plainText);
String decrypted = aes.decryptStr(encrypted);
更多工具集
| 工具类 | 功能 |
|---|---|
MailUtil |
邮件发送 |
QrCodeUtil |
二维码生成解析 |
EmojiUtil |
Emoji 表情处理 |
HttpUtil |
HTTP 请求 |
ReUtil |
正则表达式 |
模块速查表
| 分类 | 关键类 | 说明 |
|---|---|---|
| 类型转换 | Convert |
各类类型互转 |
| 日期时间 | DateUtil |
日期解析格式化 |
| 文件IO | FileUtil、IoUtil |
文件与流操作 |
| 字符串 | StrUtil |
字符串处理 |
| 反射 | ReflectUtil |
反射调用 |
| 压缩 | ZipUtil |
ZIP压缩解压 |
| 验证 | Validator |
格式校验 |
| 缓存 | CacheUtil |
多种缓存策略 |
| 加密 | SecureUtil |
对称非对称加密 |