濤。

t.

Hutool 最好用的 10 大工具类

Hutool 是一款国产开源、轻量级、零依赖的 Java 工具类库,秉持「不造重复轮子、简化开发」的核心思想,封装了几乎所有高频通用操作,大幅减少样板代码,让代码更简洁、优雅、易维护。

 

<!-- Hutool 核心依赖 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.28</version>
</dependency>

 

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 正则过滤规则,工具类已封装完善规则,兼容性更强。

 

posted on 2026-08-25 14:15  濤。  阅读(22)  评论(0)    收藏  举报

导航