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.pswp.cn/web/46405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46405.shtml
英文地址,請注明出處:http://en.pswp.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; 鏈接: 芋道源碼零基…