前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >带你认识Hutool工具包

带你认识Hutool工具包

作者头像
程序员Leo
发布于 2023-08-07 13:49:09
发布于 2023-08-07 13:49:09
87300
代码可运行
举报
文章被收录于专栏:Java知识点Java知识点
运行总次数:0
代码可运行

# 1. 📚简介

Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以 “甜甜的”。

Hutool 中的工具方法来自每个用户的精雕细琢,它涵盖了 Java 开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

Hutool 是项目中 “util” 包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的 bug。

# 🎁Hutool 名称的由来

Hutool = Hu + tool,是原公司项目底层代码剥离后的开源库,“Hu” 是公司名称的表示,tool 表示工具。Hutool 谐音 “糊涂”,一方面简洁易懂,一方面寓意 “难得糊涂”。

# 🛠️包含组件

一个 Java 基础工具类,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行封装,组成各种 Util 工具类,同时提供以下组件:

# 2. 引入

Hutool-all 是一个 Hutool 的集成打包产品,由于考虑到 “懒人” 用户及分不清各个模块作用的用户,“无脑” 引入 hutool-all 模块是快速开始和深入应用的最佳方式。

起初 Hutool 只提供了两种引入方式:

  1. 引入 hutool-all 以便使用所有工具类功能
  2. 引入 hutool-xxx 单独模块使用

# import 方式

如果你想像 Spring-Boot 一样引入 Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-bom</artifactId>
            <version>${hutool.version}</version>
            <type>pom</type>
            <!-- 注意这里是import -->
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在子模块中就可以引入自己需要的模块了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-http</artifactId>
    </dependency>
</dependencies>

使用 import 的方式,只会引入 hutool-bom 内的 dependencyManagement 的配置,其它配置在这个引用方式下完全不起作用。

# exclude 方式

如果你引入的模块比较多,但是某几个模块没用,你可以:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-bom</artifactId>
        <version>${hutool.version}</version>
        <!-- 加不加这句都能跑,区别只有是否告警  -->
        <type>pom</type>
        <exclusions>
            <exclusion>
                    <groupId>cn.hutool</groupId>
                    <artifactId>hutool-system</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

这个配置会传递依赖 hutool-bom 内所有 dependencies 的内容,当前 hutool-bom 内的 dependencies 全部设置了 version,就意味着在 maven resolve 的时候 hutool-bom 内就算存在 dependencyManagement 也不会产生任何作用。

可以根据需求对每个模块单独引入,也可以通过引入 hutool-all 方式引入所有模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.11</version>
</dependency>

# 3. 常见的类型转换

# 3.1 转换为字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a = 1;
//aStr为"1"
String aStr = Convert.toStr(a);

long[] b = {1,2,3,4,5};
//bStr为:"[1, 2, 3, 4, 5]"
String bStr = Convert.toStr(b);

运行结果:

# 3.2 转换为指定类型数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String[] b = { "1", "2", "3", "4" };
     //结果为Integer数组
     Integer[] intArray = Convert.toIntArray(b);
     System.out.println("intArray = " + Arrays.toString(intArray));

     long[] c = {1,2,3,4,5};
     //结果为Integer数组
     Integer[] intArray2 = Convert.toIntArray(c);
     System.out.println("intArray2 = " + Arrays.toString(intArray2));

     String[] d = { "1", "2", "3", "4" };
     //结果为BigDecimal数组
     //Number是BigDecimal的父类
     Number[] numbers = Convert.toNumberArray(d);
     System.out.println("numbers = " + Arrays.toString(numbers));

运行结果:

# 3.3 转换为日期对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String a = "2017-05-06";
        // 转换为Date
        Date date = Convert.toDate(a);
        System.out.println("date = " + date);
        // 转换为LocalDateTime
        LocalDateTime localDateTime = Convert.toLocalDateTime(a);
        System.out.println("localDateTime = " + localDateTime);

        System.out.println("date = " + DateUtil.date());

运行结果:

# 3.4 转换为集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String[] strArray = {"a", "b", "c"};
List<String> list = Convert.toList(String.class, strArray);
System.out.println("list = " + list);

运行结果:

# 3.5 转换为指定类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User u = new User("1002","jack",18);
Person p = Convert.convert(Person.class, u);

# 4. 日期时间工具 - DateUtil

# 4.1 当前时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//当前时间 yyyy-MM-dd HH:mm:ss
      Date date = DateUtil.date();
      System.out.println("date = " + date);
      //当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
      String now = DateUtil.now();
      System.out.println("now = " + now);
      //当前日期字符串,格式:yyyy-MM-dd
      String today= DateUtil.today();
      System.out.println("today = " + today);

运行结果:

# 4.2 字符串转 Date

  • DateUtil.parse 方法会自动识别一些常用格式,包括:
    • yyyy-MM-dd HH:mm:ss
    • yyyy/MM/dd HH:mm:ss
    • yyyy 年 MM 月 dd 日 HH 时 mm 分 ss 秒
    • yyyyMMdd
    • yyyy-MM-dd
    • yyyy.MM.dd
    • HH:mm:ss
    • yyyy-MM-dd HH:mm:ss.SSS
    • yyyyMMddHHmmss
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String dateStr = "2023-06-28 10:00:00";
Date date = DateUtil.parse(dateStr);
System.out.println("date = " + date);

运行结果:

# 4.3 Date 转字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 当前时间
Date date = DateUtil.date();
System.out.println("date = " + date);

String format = DateUtil.format(date, "yyyy/MM/dd");
System.out.println("format = " + format);
String formatDate = DateUtil.formatDate(date);
System.out.println("formatDate = " + formatDate);
String formatDateTime = DateUtil.formatDateTime(date);
System.out.println("formatDateTime = " + formatDateTime);
String formatTime = DateUtil.formatTime(date);
System.out.println("formatTime = " + formatTime);

运行结果:

# 4.4 获取 Date 对象的某个部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date date = DateUtil.date();
 System.out.println("date = " + date);
//获得年的部分 int类型
 int year = DateUtil.year(date);
 System.out.println("year = " + year);
 //获得月份,从0开始计数,int类型
 int month = DateUtil.month(date);
 System.out.println("month = " + month);
 //获得月份枚举
 Month month1 = DateUtil.monthEnum(date);
 System.out.println("month1 = " + month1);
 //获取日期是星期几,1表示周日,2表示周一,int类型
 int i = DateUtil.dayOfWeek(date);
 System.out.println("i = " + i);
 //获取日期是所在年的第几天
 int i1 = DateUtil.dayOfYear(date);
 System.out.println("i1 = " + i1);

运行结果:

# 5. 字符串工具 - StrUtil

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//判断是否为空字符串
String str = "test";
boolean empty = StrUtil.isEmpty(str);
System.out.println("empty = " + empty);
boolean notEmpty = StrUtil.isNotEmpty(str);
System.out.println("notEmpty = " + notEmpty);
//去除字符串的前后缀
String fileName1 = StrUtil.removeSuffix("test.jpg", ".jpg");
System.out.println("fileName1 = " + fileName1);
String fileName2 = StrUtil.removePrefix("test.jpg", "test");
System.out.println("fileName2 = " + fileName2);
//格式化字符串
String template = "你好,我是{}";
String str2 = StrUtil.format(template, "test");
System.out.println("str2 = " + str2);

结果:

# 6. 对象工具 - ObjectUtil

# 6.1 ObjectUtil.equal

比较两个对象是否相等,相等需满足以下条件之一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object a = null;
Object b = null;

// true
ObjectUtil.equals(a, b);

# 6.2 ObjectUtil.length

计算对象长度,如果是字符串调用其 length 方法,集合类调用其 size 方法,数组调用其 length 属性,其他可遍历对象遍历计算长度。

支持的类型包括:

  • CharSequence
  • Collection
  • Map
  • Iterator
  • Enumeration
  • Array
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] array = new int[]{1,2,3,4,5};

// 5
int length = ObjectUtil.length(array);

Map<String, String> map = new HashMap<>();
map.put("a", "a1");
map.put("b", "b1");
map.put("c", "c1");

// 3
length = ObjectUtil.length(map);

# 6.3 ObjectUtil.contains

对象中是否包含元素。

支持的对象类型包括:

  • String
  • Collection
  • Map
  • Iterator
  • Enumeration
  • Array
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] array = new int[]{1,2,3,4,5};

// true
final boolean contains = ObjectUtil.contains(array, 1);

# 6.4 判断是否为 null

  • ObjectUtil.isNull
  • ObjectUtil.isNotNull

注意:此方法不能判断对象中字段为空的情况,如果需要检查 Bean 对象中字段是否全空,请使用 BeanUtil.isEmpty

# 7. 数字工具 - NumberUtil

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//封装BigDecimal中的方法来保留小数
double te1=123456.123456;
double te2=123456.128456;
Console.log(round(te1,4));//结果:123456.1235
Console.log(round(te2,4));//结果:123456.1285

//对float、double、BigDecimal做加减乘除操作
result = NumberUtil.add(te1, te2);
result = NumberUtil.sub(te1, te2);
result = NumberUtil.mul(te1, te2);
result = NumberUtil.div(te1, te2);
//保留两位小数
BigDecimal roundNum = NumberUtil.round(te1, 2);
String te3 = "1.234";
//判断是否为数字、整数、浮点数、质数
NumberUtil.isNumber(te1);
NumberUtil.isInteger(te1);
NumberUtil.isDouble(te1);
NumberUtil.isPrimes(te1)

# 8. 数组工具 - ArrayUtil

# 1. 判空

数组的判空类似于字符串的判空,标准是 null 或者数组长度为 0,ArrayUtil 中封装了针对原始类型和泛型数组的判空和判非空:

  1. 判断空
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] a = {};
int[] b = null;
ArrayUtil.isEmpty(a);
ArrayUtil.isEmpty(b);
  1. 判断非空
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int[] a = {1,2};
ArrayUtil.isNotEmpty(a);

# 9. BeanUtil

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PmsBrand brand = new PmsBrand();
brand.setId(1L);
brand.setName("小米");
brand.setShowStatus(0);
//Bean转Map
Map<String, Object> map = BeanUtil.beanToMap(brand);
LOGGER.info("beanUtil bean to map:{}", map);
//Map转Bean
PmsBrand mapBrand = BeanUtil.mapToBean(map, PmsBrand.class, false);
LOGGER.info("beanUtil map to bean:{}", mapBrand);
//Bean属性拷贝
PmsBrand copyBrand = new PmsBrand();
BeanUtil.copyProperties(brand, copyBrand);
LOGGER.info("beanUtil copy properties:{}", copyBrand);

# 10. 随机工具 - RandomUtil

# 10.1 获得随机数 int 值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int randomInt = RandomUtil.randomInt();
System.out.println("randomInt = " + randomInt);

结果:

# 10.2 获得指定范围内的随机数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int randomInt = RandomUtil.randomInt(10,100);
System.out.println("randomInt = " + randomInt);
int anInt = RandomUtil.randomInt(20);
System.out.println("anInt = " + anInt);

结果:

# 10.3 获得一个随机固定长度的字符串(只包含数字和字符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str = RandomUtil.randomString(10);
System.out.println("str = " + str);

结果:

# 10.4 获得一个只包含数字的固定长度字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String str = RandomUtil.randomNumbers(5);
System.out.println("str = " + str);

结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【全网最新】如何在本地IDE Run起OpenTSDB源码
有需求了解一下Opentsdb的源码,然后想着能在本地run起来,打些断点和日志来跟一下,然后兴致勃勃去网上找了资料看看能否快速run起来,但是发现所有的博客、文档啥的好像都来自同一出处,而且最后run起来也是很模糊,按教程我还是没成功。于是自己摸索着,慢慢解决问题run了起来,然后记录一下,希望对想要学习opentsdb的同学有帮助。转载的话麻烦注明出处~
garyhwang
2021/06/19
1.1K0
【全网最新】如何在本地IDE Run起OpenTSDB源码
时序列数据库武斗大会之 OpenTSDB 篇
刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融、通信以及Android手机操作系的开发,熟悉Linux及后台开发技术。曾参与翻译过《第一本Docker书》、《GitHub入门与实践》、《Web应用安全权威指南》、《WEB+DB PRESS》、《Software Design》等书籍,也是Docker入门与实践课程主讲人。本文所阐述的「时间序列数据库」,系笔者所负责产品 Cloud Insight 对性能指标进行聚合、分组、过滤过程中的梳理和总结。 在前面的《时序列数据库武斗大会之
CSDN技术头条
2018/02/12
1.3K0
时序列数据库武斗大会之 OpenTSDB 篇
Opentsdb安装部署(单机版)
opentsdb是基于Hbase的时序数据库[时间序列数据库]。不具备通用性,主要针对具有时间特性和需求的数据,如监控数据、温度变化数据等。opentsdb说是数据库,但并不能称作为数据库,他是在Hbase(HBase才是具有存储功能的)的基础上,进行数据结构的优化和处理,从而适合存储具有时间特性的数据,同时提供特定的工具进行查询等操作。
子润先生
2021/07/09
1.5K0
OpenTSDB 数据存储详解
随着互联网、尤其是物联网的发展,我们需要把各种类型的终端实时监测、检查与分析设备所采集、产生的数据记录下来,在有时间的坐标中将这些数据连点成线,往过去看可以做成多纬度报表,揭示其趋势性、规律性、异常性;往未来看可以做大数据分析,机器学习,实现预测和预警。
2020labs小助手
2020/07/16
1.7K0
hbase+opentsdb 单机版搭建
cd /root/ tar xf zookeeper-3.4.8.tar.gz -C ./ mv zookeeper-3.4.8 /opt/zk
保持热爱奔赴山海
2019/09/18
1.7K1
hbase+opentsdb 单机版搭建
elk基于jolokia监控springboot应用jvm方案
目前大部分应用都采用springboot 的方式部署,springboot 采用jar包发布,而jvm的运行状态又比较关键,因此用elk对jvm监控进行了集成,步骤如下:
冬天里的懒猫
2020/08/03
1.2K0
时序数据库:TDengine与其他时序数据库比对测试
TDengine Database开源项目里已经包含了性能对比测试的工具源代码。https://github.com/taosdata/TDengine/tests/comparisonTest,并基于这个开源的测试工具开展了TDengine和InfluxDB对比测试,TDengine和OpenTSDB对比测试,TDengine和Cassandra对比测试等一系列性能对比测试。为了更客观的对比TDengine和其他时序数据库(Time-Series Database)的性能差异,本项目采用由InfluxDB团队开源的性能对比测试工具来进行对比测试,相同的数据产生器,相同的测试用例,相同的测试方法,以保证测试的客观公平。
Freedom123
2024/03/29
1.9K0
Prometheus +VictoriaMetrics+Granafa安装部署
https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
授客
2025/01/19
1860
Prometheus +VictoriaMetrics+Granafa安装部署
(七)Flume搭建、组成与测试
服务器hadoop002 服务器hadoop003 服务器hadoop004
wolf
2020/09/23
9260
(七)Flume搭建、组成与测试
开源数据质量解决方案——Apache Griffin入门宝典
提到格里芬—Griffin,大家想到更多的是篮球明星或者战队名,但在大数据领域Apache Griffin(以下简称Griffin)可是数据质量领域响当当的一哥。先说一句:Griffin是大数据质量监控领域唯一的Apache项目,懂了吧。
用户6070864
2022/09/19
3.1K0
开源数据质量解决方案——Apache Griffin入门宝典
通过 Rally 进行 OpenStack Tempest 测试
Rally 基本介绍 Rally 是OpenStack社区推出开源测试工具,可用于对OpenStack各个组件进行性能测试。通过使用Rally组件,用户可完成OpenStack云计算平台的安装部署、功
tanmx
2018/07/16
3.1K0
Android Linux Zygote启动
Android启动的第一个进程是由Linux Kernel启动的init进程。在init进程启动的过程中,会通过解析init.rc文件来启动zygote进程。
Rouse
2020/12/14
1.5K0
Android Linux Zygote启动
Install Telegraf
类似于 Elasticsearch 的 ELK 技术栈,InfluxDB 也有一套 TICK 技术栈
franket
2021/08/11
9960
Redis应用—7.大Value处理方案
步骤一:首先需要配置一个crontab定时调度shell脚本,然后该脚本每天凌晨会通过rdbtools⼯具解析Redis的RDB⽂件,接着对解析出的内容进行过滤,把RDB⽂件中的⼤key导出到CSV⽂件。
东阳马生架构
2025/03/07
1050
大数据繁荣生态圈组件之实时大数据Druid小传(三)Druid入门实操
3.访问WebUI 组件名 URL broker http://node01:8888 coordinator、overlord http://node01:8081/index.html middleManager、historical http://node01:8090/console.html
Maynor
2022/04/21
8820
大数据繁荣生态圈组件之实时大数据Druid小传(三)Druid入门实操
flume kafka和sparkstreaming整合
本文介绍Flume、Kafka和Sparkstreaming的整合。代码流程是,我们通过shell脚本重播测试轨迹数据到指定轨迹文件中,使用Flume监听该轨迹数据文件,实时将轨迹数据发送到Kafka,然后使用SparkStreaming简单统计轨迹数据量。
soundhearer
2020/10/15
7360
flume kafka和sparkstreaming整合
Kafka学习笔记之kafka常见报错及解决方法(topic类、生产消费类、启动类)
解决方法:Failed to acquire lock on file .lock in /var/log/kafka-logs.--问题原因是有其他的进程在使用kafka,ps -ef|grep kafka,杀掉使用该目录的进程即可;
Jetpropelledsnake21
2020/12/25
8K0
ctsdb对接ELK生态组件及grafana
    腾讯CTSDB是一款分布式、可扩展、支持近实时数据搜索与分析的时序数据库,且兼容ELK生态组件,用户可以非常方便的使用ELK组件与CTSDB对接。ELK组件提供了丰富的数据处理功能,包括数据采集、数据清洗、可视化图形展示等。常用的ELK生态组件包括Filebeat、Logstash、Kibana。同时,CTSDB也支持Grafana作为可视化平台。常见的ELK架构图如下,
用户2074636
2018/06/12
2.6K3
linux进程管理工具-supervisor
作者:matrix 被围观: 2,800 次 发布时间:2017-02-13 分类:Linux 零零星星 | 无评论 »
HHTjim 部落格
2022/09/26
9470
linux进程管理工具-supervisor
Prometheus+Grafana+altermanager监控k8s并配置报警[通俗易懂]
通过daemonset部署可使每个节点都有一个Pod来采集数据,node-exporter.yaml 内容如下:
全栈程序员站长
2022/08/25
4.5K0
Prometheus+Grafana+altermanager监控k8s并配置报警[通俗易懂]
相关推荐
【全网最新】如何在本地IDE Run起OpenTSDB源码
更多 >
LV.2
专业逮虾户学生
目录
  • # 1. 📚简介
    • # 🎁Hutool 名称的由来
    • # 🛠️包含组件
  • # 2. 引入
    • # import 方式
    • # exclude 方式
  • # 3. 常见的类型转换
    • # 3.1 转换为字符串
    • # 3.2 转换为指定类型数组
    • # 3.3 转换为日期对象
    • # 3.4 转换为集合
    • # 3.5 转换为指定类型
  • # 4. 日期时间工具 - DateUtil
    • # 4.1 当前时间
    • # 4.2 字符串转 Date
    • # 4.3 Date 转字符串
    • # 4.4 获取 Date 对象的某个部分
  • # 5. 字符串工具 - StrUtil
  • # 6. 对象工具 - ObjectUtil
    • # 6.1 ObjectUtil.equal
    • # 6.2 ObjectUtil.length
    • # 6.3 ObjectUtil.contains
    • # 6.4 判断是否为 null
  • # 7. 数字工具 - NumberUtil
  • # 8. 数组工具 - ArrayUtil
    • # 1. 判空
  • # 9. BeanUtil
  • # 10. 随机工具 - RandomUtil
    • # 10.1 获得随机数 int 值
    • # 10.2 获得指定范围内的随机数
    • # 10.3 获得一个随机固定长度的字符串(只包含数字和字符
    • # 10.4 获得一个只包含数字的固定长度字符串
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档