前言
大家好,我是小斯。
在日常 Java 开发中,相信对Hutool工具类并不陌生,哪些又是我们开发中最常使用的呢?
我们知道Hutool是一款国产开源、轻量级、零依赖的 Java 工具类库,秉持「不造重复轮子、简化开发」的核心思想,封装了几乎所有高频通用操作,大幅减少样板代码,让代码更简洁、优雅、易维护。
本文精选生产环境使用率最高、提效最明显的 10 个 Hutool 工具类,每个工具类包含:核心介绍 + 实战使用步骤 + 常用代码示例 + 独家避坑指南,全覆盖日常开发场景,看完直接上手干活。
一、前置准备:引入 Hutool 依赖
所有工具类使用前,只需在 Maven 项目中引入核心依赖,无需额外配置,开箱即用。
<!-- Hutool 核心依赖 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.28</version> </dependency>版本适配说明:Hutool 5.x 及以上版本适配 JDK8+,低版本 JDK 可使用 4.x 版本,生产环境建议使用稳定版,避免快照版。
二、十大高频 Hutool 工具类实战详解
1. StrUtil 字符串工具类(最常用)
核心作用
彻底替代原生 String 操作,解决原生字符串判空、截取、拼接、格式化繁琐问题,天然规避空指针异常,是日常开发使用频率最高的工具类。
常用实战方法
public class StrUtilTest { public static void main(String[] args) { // 1. 判空(兼容null、空字符串、空格) StrUtil.isBlank(null); // true StrUtil.isBlank(" "); // true StrUtil.isNotBlank("test");// true // 2. 字符串截取(安全截取,不会下标越界) StrUtil.sub("hutool工具类", 0, 4); // hutoo // 3. 字符串格式化(替代繁琐的String.format) StrUtil.format("姓名:{},年龄:{}", "张三", 22); // 4. 去除首尾空格、空白字符 StrUtil.trim(" hutool "); } }避坑指南
isBlank 与 isEmpty 区别:
isBlank判定 null、空串、全空格;isEmpty只判定 null 和空串,空格视为非空,业务判空优先用isBlank。截取安全:原生 substring 越界会报错,StrUtil.sub 自动容错,超出长度自动截断,无需手动判断下标。
禁止用字符串原生
equals("")判空,统一使用 StrUtil,减少空指针隐患。
2. DateUtil 日期时间工具类
核心作用
终结 JDK 原生 Date、SimpleDateFormat 线程不安全、代码冗余、计算繁琐问题,支持日期解析、格式化、偏移、区间计算、时间对比等全场景操作。
常用实战方法
public class DateUtilTest { public static void main(String[] args) { // 1. 获取当前时间 Date now = DateUtil.date(); // 2. 字符串转日期(自动适配常见格式) Date date = DateUtil.parse("2025-08-29 12:30:00"); // 3. 日期偏移计算 Date tomorrow = DateUtil.tomorrow(); // 明天 Date before10Min = DateUtil.offsetMinute(now, -10); // 10分钟前 Date after3Day = DateUtil.offsetDay(now, 3); // 3天后 // 4. 获取一天起止时间(统计常用) Date startOfDay = DateUtil.beginOfDay(now); // 当天00:00:00 Date endOfDay = DateUtil.endOfDay(now); // 当天23:59:59 // 5. 计算日期差值 long day = DateUtil.betweenDay(startOfDay, endOfDay, true); } }避坑指南
线程安全:DateUtil 底层规避了 SimpleDateFormat 线程不安全问题,可在多线程、循环中放心使用。
解析容错:parse 方法支持 yyyy-MM-dd、yyyy/MM/dd 等多种格式,但自定义非常规格式需手动指定格式化模板。
时间偏移负数代表往前、正数代表往后,不要写反参数;统计时间区间务必用 beginOfDay/endOfDay,避免边界数据遗漏。
3. Convert 万能类型转换器
核心作用
一站式解决 Java 各类数据类型转换,替代 parseInt、valueOf、数组转换、日期转换等零散代码,支持自动容错,转换失败不抛异常。
常用实战方法
public class ConvertTest { public static void main(String[] args) { // 1. 字符串转数字 Integer num = Convert.toInt("123"); // 2. 数组类型转换 String[] strArr = {"1", "2", "3"}; Integer[] intArr = Convert.toIntArray(strArr); // 3. 金额大写转换(财务场景必备) String money = Convert.digitToChinese(12345.67); // 4. 字节数组转字符串、十六进制转换 String hex = Convert.toHex("hutool".getBytes()); } }避坑指南
容错机制:转换失败不会抛异常,会返回默认值(数字返回0、对象返回null),业务中需手动判空,避免默认值引发逻辑错误。
财务金额转换优先使用
digitToChinese,自带精度处理,避免手动计算丢失精度。高精度数字转换(BigDecimal)不建议使用,优先原生构造方法,防止精度丢失。
4. JSONUtil JSON 解析工具类
核心作用
无需依赖 FastJSON、Jackson,原生实现 JSON 序列化、反序列化、JSON 对象构建,轻量高效,适配绝大多数接口参数解析场景。
常用实战方法
public class JSONUtilTest { public static void main(String[] args) { // 1. 对象转JSON字符串 User user = new User("张三", 22); String jsonStr = JSONUtil.toJsonStr(user); // 2. JSON字符串转对象 User parseUser = JSONUtil.toBean(jsonStr, User.class); // 3. JSON字符串转Map Map<String, Object> map = JSONUtil.parseObj(jsonStr); // 4. 优雅构建JSON对象 JSONObject jsonObject = JSONUtil.createObj() .set("name", "李四") .set("age", 25); } }避坑指南
复杂嵌套 JSON、泛型集合解析,建议使用
JSONUtil.parseType,避免泛型擦除导致解析失败。序列化默认忽略 null 值,如需保留 null 字段,需手动配置序列化规则。
大型项目、高并发场景优先使用 Jackson,JSONUtil 适合中小型项目、快速开发场景。
5. HttpUtil HTTP 请求工具类
核心作用
极简封装 HTTP GET、POST、PUT、DELETE 请求,无需手动封装 HttpClient,一行代码完成接口调用,适配第三方接口对接场景。
常用实战方法
public class HttpUtilTest { public static void main(String[] args) { // 1. 简单GET请求 String getResult = HttpUtil.get("https://www.baidu.com"); // 2. POST表单请求 Map<String, Object> paramMap = new HashMap<>(); paramMap.put("name", "测试"); String postResult = HttpUtil.post("http://localhost:8080/test", paramMap); // 3. 带超时时间的请求(生产必备) String result = HttpUtil.createGet("https://api.example.com") .timeout(3000) // 3秒超时 .execute() .body(); } }避坑指南
致命坑:HttpUtil 默认超时时间为 -1(永不超时),生产环境必须手动设置超时时间,否则会导致线程阻塞、服务卡死。
频繁调用第三方接口的高并发场景,不建议使用 HttpUtil,推荐原生 HttpClient 连接池。
请求 HTTPS 接口无需手动配置证书,Hutool 自动适配,简化开发。
6. FileUtil 文件工具类
核心作用
封装文件、目录的创建、删除、复制、移动、遍历、读写操作,兼容 Windows/Linux 系统,彻底简化 IO 操作代码。
常用实战方法
public class FileUtilTest { public static void main(String[] args) { // 1. 创建文件(自动创建父目录) File file = FileUtil.touch("D:/hutool/test.txt"); // 2. 写入文件 FileUtil.writeUtf8("测试内容", file); // 3. 读取文件内容 String content = FileUtil.readUtf8String(file); // 4. 删除文件/目录(递归删除文件夹) FileUtil.del("D:/hutool"); // 5. 遍历目录文件 List<File> fileList = FileUtil.ls("D:/hutool"); } }避坑指南
FileUtil.del支持递归删除文件夹,功能强大但风险高,生产环境禁止直接删除根目录、系统目录。大文件读写不建议使用工具类默认方法,会一次性加载全部内容到内存,易造成内存溢出,需分段读写。
统一使用 UTF-8 读写方法(readUtf8String/writeUtf8),避免编码乱码问题。
7. CollectionUtil 集合工具类
核心作用
解决 List、Set、Map 集合判空、遍历、交集、差集、并集、空集合创建等通用问题,规避集合空指针异常。
常用实战方法
public class CollectionUtilTest { public static void main(String[] args) { List<String> list1 = Arrays.asList("1", "2", "3"); List<String> list2 = Arrays.asList("3", "4", "5"); // 1. 集合判空 CollectionUtil.isEmpty(list1); CollectionUtil.isNotEmpty(list1); // 2. 取交集、差集、并集 List<String> intersection = CollectionUtil.intersection(list1, list2); List<String> subtract = CollectionUtil.subtract(list1, list2); // 3. 空集合创建(线程安全) List<String> emptyList = CollectionUtil.newArrayList(); } }避坑指南
禁止使用原生
list.size() == 0判空,优先使用CollectionUtil.isEmpty,天然兼容 null 集合。集合交集、差集操作会生成新集合,不会修改原集合,无需担心原数据被篡改。
高并发场景创建集合,使用工具类 newArrayList 可规避空集合修改异常。
8. IdUtil 唯一ID生成工具类
核心作用
封装主流唯一 ID 生成算法,支持雪花算法、UUID、简洁 UUID,适配分布式系统订单ID、主键ID、流水号生成场景。
常用实战方法
public class IdUtilTest { public static void main(String[] args) { // 1. 雪花算法ID(分布式推荐,有序唯一) long snowflakeId = IdUtil.getSnowflake(1, 1).nextId(); // 2. 简洁UUID(无横线) String simpleUuid = IdUtil.simpleUUID(); // 3. 标准UUID String uuid = IdUtil.randomUUID(); } }避坑指南
分布式核心坑:雪花算法必须手动指定机器ID、数据中心ID(0-31),多服务部署必须保证不重复,否则会出现ID重复。
单机项目可直接使用默认方法,分布式项目禁止使用默认无参雪花算法。
数据库主键优先使用雪花ID,相比UUID更有序、索引效率更高。
9. RandomUtil 随机数工具类
核心作用
优化原生 Random 工具,封装随机数字、随机字符串、随机布尔值、随机集合元素等方法,简化随机场景开发。
常用实战方法
public class RandomUtilTest { public static void main(String[] args) { // 1. 指定范围随机整数 [10,100) int num = RandomUtil.randomInt(10, 100); // 2. 生成随机字符串(验证码场景) String code = RandomUtil.randomNumbers(6); // 6位数字验证码 String str = RandomUtil.randomString(8); // 3. 随机获取集合元素 List<String> list = Arrays.asList("A", "B", "C"); String randomEle = RandomUtil.randomEle(list); } }避坑指南
所有随机数均为伪随机数,高安全场景(支付、加密)不建议使用,需使用加密级随机算法。
验证码生成优先用 randomNumbers,纯数字更简洁,避免大小写混淆问题。
循环批量生成随机数时,无需重复创建工具类,直接调用静态方法即可。
10. HtmlUtil HTML 工具类
核心作用
专为富文本、网页内容处理设计,支持 HTML 标签清理、转义、防 XSS 攻击,是后台内容管理、富文本展示必备工具。
常用实战方法
public class HtmlUtilTest { public static void main(String[] args) { String htmlStr = "<div><script>alert('攻击')</script>测试内容</div>"; // 1. 清除所有HTML标签,保留文本内容 String cleanStr = HtmlUtil.cleanHtmlTag(htmlStr); // 2. HTML转义(防XSS攻击) String escape = HtmlUtil.escape(htmlStr); // 3. 反转义 String unEscape = HtmlUtil.unescape(escape); } }避坑指南
富文本内容入库、前端展示前,必须使用
HtmlUtil.escape转义,防止 XSS 脚本注入攻击。cleanHtmlTag仅清除标签,不会过滤脚本逻辑,安全过滤优先使用转义方法。无需手动编写 HTML 正则过滤规则,工具类已封装完善规则,兼容性更强。
三、总结
Hutool 之所以成为 Java 开发必备工具库,核心优势就是极简、高效、容错、开箱即用,完美解决了原生 JDK API 繁琐、易错、不安全的问题。