Hutool-Guava

目录

一、Guava

二、Hutool

三、区别与联系

四、使用场景

五、Guava工具类

1.集合工具类

2.字符串工具类

3.并发工具类

六、Hutool

1.字符串工具类

2.文件工具类


Hutool 和 Guava 都是 Java 开发中非常实用的工具库,它们提供了许多方便的工具类和方法,简化了常见的编程任务。

一、Guava

Guava 是由 Google 开发并维护的一个开源工具包,它提供了很多强大的集合类、并发工具、缓存机制、原生类型支持、字符串处理、I/O 操作等功能。Guava 的一些亮点包括:

  • 集合框架扩展:提供了额外的集合类,如Multiset, Multimap, ImmutableList, ImmutableSet等。

  • 缓存:提供了LoadingCache,可以实现高性能的本地缓存。

  • 并发工具:如Service, ListenableFuture, ThreadPoolExecutor的扩展等。

  • 流操作:虽然在 Java 8 中引入了 Stream API,但在 Guava 中也有自己的流处理工具。

  • 事件总线:用于组件间事件传递的机制。

  • 限流:使用令牌桶算法实现请求限流。

二、Hutool

Hutool 是一个现代的 Java 工具库,它的目标是“让Java更加优雅”,提供了一系列工具方法,使得开发人员可以更快速地完成日常的开发工作。Hutool 的特点包括:

  • 工具方法丰富:几乎覆盖了所有常见的开发需求,如文件读写、网络请求、加密解密、日期处理、JSON转换等。

  • 轻量级:Hutool 可以按需导入,不需要的模块不会引入,减小项目体积。

  • 易于使用:API 设计友好,方法命名直观,易于理解和使用。

  • 兼容性:兼容 Java 6+,可以在各种环境中使用。

三、区别与联系

  • 功能:两者都提供了集合操作、缓存、并发工具等,但具体实现和API风格可能不同。

  • 设计:Guava 更倾向于提供底层的、高性能的工具,而 Hutool 则更侧重于上层的、便捷的工具方法。

  • 社区与支持:Guava 由于是 Google 维护,有强大的社区支持和文档,而 Hutool 作为一个国内开源项目,也有活跃的中文社区和详细的中文文档。

四、使用场景

  • Guava:适合大型项目,尤其是需要高性能、高并发处理的场景,如分布式系统、微服务架构中的缓存管理、限流控制等。

  • Hutool:适合快速开发,特别是对于中小型项目或者需要快速原型开发的场景,如Web应用、工具类项目、脚本编写等。

最终选择哪个库,取决于项目的具体需求、团队熟悉程度以及个人偏好。在实际开发中,也可以根据需要同时使用这两个库的不同部分。

五、Guava工具类

1.集合工具类

ImmutableList, ImmutableSet, ImmutableMap

  • 问题:在Java中创建不可变集合通常需要手动创建数组然后传递给集合构造器,这既繁琐又容易出错。

  • 解决方案:Guava的ImmutableList, ImmutableSet, ImmutableMap提供了一种简单的方法来创建不可变集合,确保集合一旦创建就不能被修改,这对于多线程环境特别有用。

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableMap;
​
// 创建不可变列表
ImmutableList<String> list = ImmutableList.of("one", "two", "three");
​
// 创建不可变集合
ImmutableSet<String> set = ImmutableSet.copyOf(Arrays.asList("a", "b", "c"));
​
// 创建不可变映射
ImmutableMap<String, Integer> map = ImmutableMap.of("key1", 1, "key2", 2);

2.字符串工具类

Strings

  • 问题:Java标准库中没有提供简洁的字符串处理方法,如判断字符串是否为空或只包含空白字符。

  • 解决方案:Guava的Strings类提供了诸如nullToEmpty, join, split等方法,可以方便地处理字符

import com.google.common.base.Strings;
​
// 将null转换成空字符串
String str = Strings.nullToEmpty(null); // 返回 ""
​
// 连接字符串数组
String joined = Strings.join(new String[]{"a", "b", "c"}, ","); // 返回 "a,b,c"

3.并发工具类

ListenableFuture

  • 问题:Java标准库中的Future接口在使用时不够灵活,且异常处理不便。

  • 解决方案:Guava的ListenableFuture提供了一个更强大的异步编程模型,可以添加回调函数处理结果异常

import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
​
// 创建一个ListenableFuture实例
SettableFuture<String> future = SettableFuture.create();
​
// 设置结果
future.set("Result!");
​
// 添加回调函数
future.addListener(() -> {try {System.out.println(future.get()); // 输出 "Result!"} catch (Exception e) {e.printStackTrace();}
}, MoreExecutors.directExecutor());

六、Hutool

1.字符串工具类

StrUtil

  • 问题:Java标准库中缺乏简洁的字符串处理方法,如判断字符串是否为空或只包含空白字符。

  • 解决方案:Hutool的StrUtil类提供了诸如isBlank, join, split等方法,可以方便地处理字符串。


import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
​
// 判断字符串是否为空或只包含空白字符
boolean blank = StrUtil.isBlank(null); // 返回 true
​
// 连接字符串数组java
String joined = StrUtil.join(",", new String[]{"a", "b", "c"}); // 返回 "a,b,c"
​
// 分割字符串
List<String> split = StrUtil.split("a,b,c", ',');

2.文件工具类

FileUtil

  • 问题:Java标准库中处理文件输入输出的代码往往冗长且容易出错。

  • 解决方案:Hutool的FileUtil类提供了简洁的方法来读写文件,如readUtf8String和writeUtf8String。

import cn.hutool.core.io.FileUtil;
​
// 读取文件内容
String content = FileUtil.readUtf8String("path/to/file.txt");
​
// 写入文件内容
FileUtil.writeUtf8String("Hello, World!", "path/to/file.txt");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节抖音电商 后端开发岗位 一面

笔者整理答案&#xff0c;以供参考 自我介绍 项目&#xff08;20分钟&#xff09; RocketMQ延时消息的底层实现 回答&#xff1a; 延时消息的实现主要依赖于RocketMQ中的定时任务机制。消息被发送到Broker时&#xff0c;会先存储在一个特定的延时消息队列中。Broker会定时扫…

c++ extern 关键字

C中的extern关键字和跨语言互操作 变量的声明与定义 extern关键字用于声明在另一个翻译单元&#xff08;文件&#xff09;中定义的变量或函数。通过extern关键字&#xff0c;可以在多个文件中访问全局变量或函数。 变量声明示例 文件&#xff1a;main.cpp #include <io…

chatglm2-6b-prompt尝试

参考https://cloud.tencent.com/developer/article/2426296 chatglm2-6b&#xff0c;通过prompt来实现zero-shot/fewshot的自然语言处理任务 import json import re import os from modelscope.utils.constant import Tasks from modelscope import Model from modelscope.pi…

再议扩散模型

目录 一、基础知识 1、数学期望 2、概率表示 3、KL散度 二、扩散过程 三、理想的去噪过程 四、真实的去噪过程 五、噪声生成 导言 笔者早些时候曾粗略看过扩散模型的流程&#xff0c;但对于底层算法&#xff08;尤其是概率论方面&#xff09;&#xff0c;理解不够透彻…

pytorch学习(五)tensorboard使用

1. 创建环境 首先创建一个环境: conda create -n pytorch conda activate pytorch 然后安装tensorboard pip install tensorboard 安装opencv pip install opencv-python 2. 简单的案例 标量和图像的显示&#xff1a; 2.1标量实现的方法是add_scalar,第一个参数是给显…

探索Puppeteer的强大功能:抓取隐藏内容

背景/引言 在现代网页设计中&#xff0c;动态内容和隐藏元素的使用越来越普遍&#xff0c;这些内容往往只有在特定的用户交互或条件下才会显示出来。为了有效地获取这些隐藏内容&#xff0c;传统的静态爬虫技术往往力不从心。Puppeteer&#xff0c;作为一个强大的无头浏览器工…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中&#xff0c;语言是连接我们的桥梁。印尼语翻译通&#xff0c;一款专为打破语言障碍而生的智能翻译软件&#xff0c;让您与印尼语的世界轻松接轨。无论是商务出差、学术研究&#xff0c;还是探索印尼丰富的文化遗产&#xff0c;印尼语翻译通都是您的…

代码随想录算法训练营第三十六天|1049. 最后一块石头的重量 II 、 494. 目标和 、 474.一和零

1049. 最后一块石头的重量 II 分成两堆石头&#xff0c;一堆石头的总重量是dp[target]&#xff0c;另一堆就是sum - dp[target]。 在计算target的时候&#xff0c;target sum / 2 因为是向下取整&#xff0c;所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目录 .NET C# 使用 iText 生成PDF1 安装 iText 7 库&#xff1a;2 变量定义3 创建一个PDF4 段落5 旋转文本6 代码块7 外部链接8 内部链接9 表格10 注释11 线条12 二维码13 嵌入图像14 列表15 设置背景16 页眉17 页脚18 事件19 水印20 分栏21 源…

老古董Lisp(1):粗鲁先生Lisp再出发

粗鲁先生Lisp再出发 开始的原因 目标和梦想是最近考虑的一个问题。什么是目标&#xff1f;什么是梦想&#xff1f;梦想可以激励改变&#xff0c;目标才能实现改变。 开始这个部分的时候&#xff0c;我的梦想是什么&#xff1f;我的目标是什么&#xff1f;我想要什么&#xf…

libwebrtc.a+exosip连接fS 环境部署tips

//运行FS服务器 sudo ./freeswitch -nc -nonat //公网sudo ./freeswitch //运行客户端 sudo ./fs_cli //加载模块 load mod_av load mod_verto0.Invite交互过程 1.fs码率设置 2.用户密码改动 3.数字签名的摘要 4.FS收不到ACK 5.公网部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---栈的使用和模拟实现

文章目录 前言1.什么是栈(Stack)?2. 栈的模拟实现3.stack的使用![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.关于栈的oj题4.1.有效的括号4.2.逆波兰表达式4.3.栈的压入、弹出序列4.4.最小栈 前言 前面几篇我们学习了顺序…

Vue--Router(路由)

目录 一 Router(路由) 1.作用 2.实现步骤 3.注意 一 Router(路由) 1.作用 Router又叫做路由&#xff0c;简单来说&#xff0c;就是用来实现vue的页面之间跳转的。 我们都知道&#xff0c;使用vue必然会涉及到很多个组件&#xff0c;也就是页面&#xff0c;而页面之间肯定需…

RK3588读取不到显示器edid

问题描述 3588HDMIout接老的显示器或者HDMI转DVI接DVI显示器显示不了或者显示内容是彩色条纹,但是这种显示器测试过如果接笔记本或者主机是可以直接显示的。这一类问题是HDMI下的i2c与显示器通讯没成功,读取不到设备的edid。问题包括全志的H3 、AML的S905都有遇到 测试环境…

Qt-事件与信号

事件和信号的区别在于&#xff0c;事件通常是由窗口系统或应用程序产生的&#xff0c;信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装&#xff0c;如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

【QGroundControl二次开发】二.使用QT编译QGC(Windows)

【QGroundControl二次开发】一.开发环境准备&#xff08;Windows&#xff09; 二. 使用QT编译QGC&#xff08;Windows&#xff09; 2.1 打开QT Creator&#xff0c;选择打开项目&#xff0c;打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…

vue3-tree-org实现带照片的组织架构图

官方文档&#xff1a;vue3-tree-org 显示照片需要注意的地方 使用步骤 下载 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 实现代码 <tem…

level 6 day2 网络基础2

1.socket&#xff08;三种套接字&#xff1a;认真看&#xff09; 套接字就是在这个应用空间和内核空间的一个接口&#xff0c;如下图 原始套接字可以从应用层直接访问到网络层&#xff0c;跳过了传输层&#xff0c;比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

解决TypeError: __init__() takes 1 positional argument but 2 were given

问题描述&#xff1a; 如下图&#xff0c;在使用torch.nn.Sigmoid非线性激活时报错 源代码&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

记录贴-芋道源码

环境搭建 文字讲解 链接: 芋道源码-环境搭建&#xff08;一&#xff09;后端 链接: 芋道源码-环境搭建&#xff08;二&#xff09;前端 链接: 基于FastGPT和芋道源码挑战一句话生成代码 视频讲解 链接: 芋道源码零基础启动教程&#xff08;上&#xff09; 链接: 芋道源码零基…