hutool中的threadutil_Hutool - 好用的Java工具类库
Hutool是一個Java工具包,它幫助我們簡化每一行代碼,避免重復造輪子。如果你有需要用到某些工具方法的時候,不妨在Hutool里面找找,可能就有。本文將對Hutool中的常用工具類和方法進行介紹。9 n, v+ c0 |" i$ l
一、簡介. c; v) d: q8 C" {
0 j2 p" f, }, [9 Y3 F% S5 j一個Java基礎工具類,對文件、流、加密解密、轉碼、正則、線程、XML等JDK方法進行封裝,組成各種Util工具類,同時提供以下組件:U9 V9 v- w! `, O& Z# p9 U
8 w/ s0 U* R8 w
hutool-core 核心,包括Bean操作、日期、各種Util等% v" C9 m& l& u/ S, f* X5 h5 d
hutool-aop JDK動態代理封裝,提供非IOC下的切面支持+ E. ~# W" h4 H: Z$ _
hutool-bloomFilter 布隆過濾,提供一些Hash算法的布隆過濾
3 E& Q- u3 Z6 V0 ^3 M
hutool-cache 緩存
! Q6 n* w1 f) e
hutool-cron 定時任務模塊,提供類Crontab表達式的定時任務
! a, ~& q8 x8 H) @8 v7 r
hutool-crypto 加密解密模塊
; u??O$ D+ w??X9 G% F' ^
hutool-db JDBC封裝后的數據操作,基于ActiveRecord思想
' S9 \1 y- H' I# _
hutool-dfa 基于DFA模型的多關鍵字查找
: H" }" G- H" b- ?: ^; s
hutool-extra 擴展模塊,對第三方封裝(模板引擎、郵件等)+ B0 `- @7 j& _) {' {* _
hutool-http 基于HttpUrlConnection的Http客戶端封裝. t1 b+ u- _# ]& Z4 g- J
hutool-log 自動識別日志實現的日志門面1 W& u* j! d( f- `6 L- n
hutool-script 腳本執行封裝,例如Javascript
" t: z1 `7 [2 @( \1 K
hutool-setting 功能更強大的Setting配置文件和Properties封裝
2 f4 `; V: D4 D/ z' f3 ~( a
hutool-system 系統參數調用封裝(JVM信息等)
9 N- T9 Y0 l??a4 V
hutool-json JSON實現
! K2 N) _' i+ v8 A
hutool-captcha 圖片驗證碼實現( h5 f6 P1 m7 {, q9 H' u二、安裝( r8 M7 D! Q" y4 L& I, K
2 t8 @! }3 t/ |. W4 K
maven項目在pom.xml添加以下依賴即可:
+ p7 X0 \+ s: Z2 r7 Q? ? cn.hutool? ? hutool-all? ? 5.2.2三、常用工具類
4 Y; q??~& V) J# p5 w# {0 h??d; s! [* r* j5 U* Q7 ~4 K
1. DateUtil
% F1 q* i& D% u% p9 M8 d8 G, p5 g
4 S% G) |; K' f) P& I$ |??y' T日期時間工具類,定義了一些常用的日期時間操作方法。( s1 d$ l) Q??M2 I9 Y3 n% y, B
Date、long、Calendar之間的相互轉換9 `" V2 x+ A, @
3 t??L: X7 R% z% m2 H//當前時間Date date = DateUtil.date();//當前時間Date date2 = DateUtil.date(Calendar.getInstance());//當前時間Date date3 = DateUtil.date(System.currentTimeMillis());//當前時間字符串,格式:yyyy-MM-dd HH:mm:ssString now = DateUtil.now();//當前日期字符串,格式:yyyy-MM-ddString today= DateUtil.today();字符串轉日期
9 e9 v* _3 a- G' _! K, `0 [! Z5 g) J( E8 i2 x
DateUtil.parse方法會自動識別一些常用格式,包括:
+ t. J2 X" k& G; X??[7 }% J6 I, K2 r7 E8 z
yyyy-MM-dd HH:mm:ss2 b4 Q! c2 z??W, x8 J
yyyy-MM-dd& X! @6 R6 B5 {3 N1 N9 [- o* v9 @4 q
HH:mm:ss
( v2 B- j7 F( f+ h
yyyy-MM-dd HH:mm/ `! Y5 l. H( N; m/ Q
yyyy-MM-dd HH:mm:ss.SSS
1 M7 Y, }/ l: v??Z! A7 S% ~String dateStr = "2020-03-01";Date date = DateUtil.parse(dateStr);我們也可以使用自定義日期格式轉化:
" X* B' X7 a4 t' |String dateStr = "2020/03/02";Date date = DateUtil.parse(dateStr, "yyyy/MM/dd");格式化日期輸出* |: M& T9 C0 M; c1 a) k/ Y
: x??y* E. z7 j3 `
//結果 2020/03/01String format = DateUtil.format(date, "yyyy/MM/dd");//常用格式的格式化String formatDate = DateUtil.formatDate(date);String formatDateTime = DateUtil.formatDateTime(date);String formatTime = DateUtil.formatTime(date);獲取Date對象的某個部分
6 f- i2 w3 X0 y! O+ o# L2 _' ~/ M# J6 z! S4 \
//獲得年的部分int year = DateUtil.year(date);//獲得月份,從0開始計數int month = DateUtil.month(date);//獲得月份,從0開始計數Month monthEnum = DateUtil.monthEnum(date);//獲得日int dayOfMonth = DateUtil.dayOfMonth(date);//獲得星期數,從周日算起int dayOfWeek = DateUtil.dayOfWeek(date);//獲得星期枚舉Week dayOfWeekEnum = DateUtil.dayOfWeekEnum(date);開始和結束時間) b* @/ q7 i& H) D% O
1 ~% p$ q* i3 P& ~5 B- ?5 S) {
有的時候我們需要獲得每天的開始時間、結束時間,每月的開始和結束時間等等,DateUtil也提供了相關方法:2 y& s' h% F2 N: B5 o6 b+ f, Z1 l
//一天的開始,結果:2020-03-01 00:00:00Date beginOfDay = DateUtil.beginOfDay(date);//一天的結束,結果:2020-03-01 23:59:59Date endOfDay = DateUtil.endOfDay(date);日期時間偏移
- k' P" E: C7 L6 y2 c' A% P
' v??M' L4 _& V$ |& A日期或時間的偏移指針對某個日期增加或減少分、小時、天等等,達到日期變更的目的。Hutool也針對其做了大量封裝
0 P( s# g??p??i' w5 y& v% o# s9 [$ [Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);DateTime newDate2 = DateUtil.offsetDay(date, 3);DateTime newDate3 = DateUtil.offsetHour(date, -3);針對當前時間,提供了簡化的偏移方法(例如昨天、上周、上個月等):% e4 f+ i% B. ?' \# n3 s
//昨天DateUtil.yesterday()//明天DateUtil.tomorrow()//上周DateUtil.lastWeek()//下周DateUtil.nextWeek()//上個月DateUtil.lastMonth()//下個月DateUtil.nextMonth()日期時間差, p: {% e3 P4 C: B2 E
& S& C' K* j- C3 X; U7 V( ?有時候我們需要計算兩個日期之間的時間差(相差天數、相差小時數等等),Hutool將此類方法封裝為between方法:
+ B1 j+ S6 n; a3 B+ {% }long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);計時器: k$ s# A9 _5 v$ u) Y: S. [
- Z8 d# X: K- h/ U: b* O0 `' I計時器用于計算某段代碼或過程花費的時間- c2 c$ D& z* n! g
TimeInterval timer = DateUtil.timer();//---------------------------------//-------這是執行過程//---------------------------------timer.interval();//花費毫秒數timer.intervalRestart();//返回花費時間,并重置開始時間timer.intervalMinute();//花費分鐘數其它! U- `: q+ Y4 G* l' p) y
) M( f6 R& k5 a1 x1 I' ?//年齡DateUtil.ageOfNow("1993-03-01");//是否閏年DateUtil.isLeapYear(2017);2. Convert
; D( X. ]% m) |: D- l* ?! T# N; W' I6 A: M$ }??a5 A
類型轉換工具類,用于各種類型數據的轉換。里面封裝了針對Java常見類型的轉換,用于簡化類型轉換。Convert類中大部分方法為toXXX,參數為Object,可以實現將任意可能的類型轉換為指定類型。同時支持第二個參數defaultValue用于在轉換失敗時返回一個默認值。
% Y6 d0 O4 A8 S* u( `7 F/ A6 {Java常見類型轉換
, F- l5 F1 u. ]9 P5 ^! w??q: K5 i5 p# B: s& _
8 N+ b0 m7 d$ P! n& y- |
轉換為字符串:
# @' {- ^* T: e* M3 @9 K5 N- B- hint 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);" b. {8 w8 O8 o8 M5 w8 p; W2 M
轉換為指定類型數組:
8 i??o" J. {1 }String[] b = { "1", "2", "3", "4" };//結果為Integer數組Integer[] intArray = Convert.toIntArray(b);long[] c = {1,2,3,4,5};//結果為Integer數組Integer[] intArray2 = Convert.toIntArray(c);1 y8 Z: E- a- \0 `/ C3 h
轉換為日期對象:. J0 O# u# @/ \" Z3 o" wString a = "2020-03-01";Date value = Convert.toDate(a);- p) |" Z8 A??H2 @9 h$ }/ V
轉換為集合
5 V' U7 ?6 }0 ~; ^Object[] a = {"a", "你", "好", "", 1};List list = Convert.convert(List.class, a);//從4.1.11開始可以這么用List list = Convert.toList(a);其它類型轉換* Y/ u: e' \' _- ^; Q" @% i! g
; g; ?; G, T+ o( Q' U$ A# {. h6 d8 d' ?
標準類型! c??Z/ E4 B; w6 q通過Convert.convert(Class, Object)方法可以將任意類型轉換為指定類型,Hutool中預定義了許多類型轉換,例如轉換為URI、URL、Calendar等等。
0 |( G) G??^2 y3 e2 X, ~& u; {; N??O* |1 ?4 [5 Q1 H
泛型類型0 a3 a, m+ q0 g??|8 u8 S5 N: {通過convert(TypeReference reference, Object value)方法,自行new一個TypeReference對象可以對嵌套泛型進行類型轉換。例如,我們想轉換一個對象為List類型,此時傳入的標準Class就無法滿足要求,此時我們可以這樣:
% i" l2 x2 |4 D3 I' J; `/ \Object[] a = { "a", "你", "好", "", 1 };List list = Convert.convert(new TypeReference() {}, a);通過TypeReference實例化后制定泛型類型,即可轉換對象為我們想要的目標類型。9 o) ], ~; v! f3 K% u- Y
半角和全角轉換
! l* ^, p, L??n. d$ s# V2 Q5 d6 o+ e5 d
在很多文本的統一化中這兩個方法非常有用,主要對標點符號的全角半角轉換。
/ @! p+ H. b3 z: P9 v1 K半角轉全角:$ a1 {1 c" [: A- {6 A1 z7 b" a
String a = "123456789,$()?!:;";//結果為:"123456789,$()?!:;"String sbc = Convert.toSBC(a);全角轉半角:
+ j5 j6 @1 t5 x/ {String a = "123456789,$()?!:;";//結果為"123456789,$()?!:;"String dbc = Convert.toDBC(a);16進制(Hex); c/ G- [9 O& C+ x??\" e" q. h5 [
3 f# f! W, u2 W
在很多加密解密,以及中文字符串傳輸(比如表單提交)的時候,會用到16進制轉換,就是Hex轉換,為此Hutool中專門封裝了HexUtil工具類,考慮到16進制轉換也是轉換的一部分,因此將其方法也放在Convert類中,便于理解和查找,使用同樣非常簡單:
: q8 P; s9 |$ Y6 {轉為16進制(Hex)字符串8 Z6 n3 i- K9 P9 F* h, d. w
String a = "字符串";String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);將16進制(Hex)字符串轉為普通字符串:
, s4 E0 z: k% v$ i- gString hex = "e5ad97e7aca6e4b8b2";String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);因為字符串牽涉到編碼問題,因此必須傳入編碼對象,此處使用UTF-8編碼。 toHex方法同樣支持傳入byte[],同樣也可以使用hexToBytes方法將16進制轉為byte[]
J7 y* j1 B6 W& X( m* o; [1 VUnicode和字符串轉換
- {8 l5 Q$ L& m& t/ w" L
/ r! A??K4 ~7 p3 b# G+ Q6 Q與16進制類似,Convert類同樣可以在字符串和Unicode之間輕松轉換:+ p2 t' g: y) P5 M, y??P
String unicode = Convert.strToUnicode(a);String raw = Convert.unicodeToStr(unicode);編碼轉換0 \8 _- v* g4 [
7 e( N9 L5 U7 ], z2 Y! @2 M
在接收表單的時候,我們常常被中文亂碼所困擾,其實大多數原因是使用了不正確的編碼方式解碼了數據。于是Convert.convertCharset方法便派上用場了,它可以把亂碼轉為正確的編碼方式:V. R: E' e7 W: T
String a = "我不是亂碼";//轉換后result為亂碼String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");Assert.assertEquals(raw, a);時間單位轉換
+ ?- [3 i$ b# F$ F. T
2 \) z% q) w$ Y/ I0 nConvert.convertTime方法主要用于轉換時長單位,比如一個很大的毫秒,我想獲得這個毫秒數對應多少分:3 _3 P4 Q/ o. @
long a = 4535345;//結果為:75long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);金額大小寫轉換
+ J8 s. g& s8 J# F, o& k# O6 P??j* `; L+ F3 K' Z
面對財務類需求,Convert.digitToChinese將金錢數轉換為大寫形式:
6 [( K6 t) G) m3 |, g, l9 D! ]* bdouble money = 1234.56;//結果為:"壹仟貳佰叁拾肆元伍角陸分"String digitUppercase = Convert.digitToChinese(a);注意 轉換為大寫只能精確到分(小數點兒后兩位),之后的數字會被忽略。% ]+ }& A* z7 M/ F* }原始類和包裝類轉換
, l1 C1 |* T0 M# s, ^6 F5 o4 v. E, g9 w8 }2 X, a* K" M
有的時候,我們需要將包裝類和原始類相互轉換(比如Integer.classs 和 int.class),這時候我們可以:
/ K$ d, W) U- t//去包裝Class wrapClass = Integer.class;//結果為:int.classClass unWraped = Convert.unWrap(wrapClass);//包裝Class primitiveClass = long.class;//結果為:Long.classClass wraped = Convert.wrap(primitiveClass);3. StrUtil+ _5 F+ R' @2 v7 c
; A. U! f4 P( A# Y' M1 ~
字符串工具類,定義了一些常用的字符串操作方法。/ H& ?$ L' K( A; z* Z2 L8 p
hasBlank、hasEmpty方法% M) S??u1 M' N% h0 i
8 Q1 B* I8 S7 M6 P# E" ?
就是給定一些字符串,如果一旦有空的就返回true,常用于判斷好多字段是否有空的(例如web表單數據)。7 K& D" s* c+ ~# K
這兩個方法的區別是hasEmpty只判斷是否為null或者空字符串(""),hasBlank則會把不可見字符也算做空,isEmpty和isBlank同理。
2 y+ {: e% M+ \removePrefix、removeSuffix方法/ l# p+ v% P% t7 o( K
8 W8 l' R$ ~0 ~- [* L3 E1 P這兩個是去掉字符串的前綴后綴的,例如去個文件名的擴展名啥。
; g, q& F3 E/ v) b0 l0 `: hString fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg")??//fileName -> pretty_girl還有忽略大小寫的removePrefixIgnoreCase和removeSuffixIgnoreCase都比較實用。- ?. h??w; D' h6 ?- c3 q* g; N2 c
sub方法1 K8 e3 n4 V: y2 C+ f9 j2 }
/ s0 X% j4 C. [- T5 ?subString方法越界會報異常,得自己判斷,sub把各種情況判斷都加進來了,而且index的位置還支持負數,-1表示最后一個字符,如果不小心把第一個位置和第二個位置搞反了,也會自動修正
/ A4 u# N& A3 }( j7 i4 iString str = "abcdefgh";String strSub1 = StrUtil.sub(str, 2, 3);String strSub2 = StrUtil.sub(str, 2, -3); String strSub3 = StrUtil.sub(str, 3, 2); format方法
" @0 t5 h# w/ o1 V7 D* [! x; _% W8 T( w, p
String template = "{}和{}";String str = StrUtil.format(template, "我", "你");參數是Object類型,傳別的類型會自動調用toString()方法。
7 k/ ~8 J. }1 D* n4. NumberUtil
! Q??M: Q4 [/ v. P% q/ l2 I+ l??^??k0 _/ H) T
數字處理工具類,可用于各種類型數字的加減乘除操作及判斷類型。
* M% o( C1 F5 h+ Wdouble n1 = 1.234;double n2 = 1.234;double result;//對float、double、BigDecimal做加減乘除操作result = NumberUtil.add(n1, n2);result = NumberUtil.sub(n1, n2);result = NumberUtil.mul(n1, n2);result = NumberUtil.div(n1, n2);//保留兩位小數BigDecimal roundNum = NumberUtil.round(n1, 2);String n3 = "1.234";//判斷是否為數字、整數、浮點數NumberUtil.isNumber(n3);NumberUtil.isInteger(n3);NumberUtil.isDouble(n3);5. BeanUtil
, W2 J3 E8 K$ c/ k% X1 b' g??q1 Z% `3 e: H' x
JavaBean的工具類,可用于Map與JavaBean對象的互相轉換以及對象屬性的拷貝。
7 D) n4 k% E6 X1 ^8 v& {/ J1 nMap轉Bean; q% b7 l4 O8 H/ H) T
& p, A7 A. I1 a% t, K% `7 ^: V提供了Map對象鍵值對注入Bean,其方法有:: E# i. S7 O( [8 u" z5 m
" f; H) D) z% C
BeanUtil.fillBeanWithMap 使用Map填充bean4 J/ q! N$ R3 eHashMap map = CollUtil.newHashMap();map.put("name", "Joe");map.put("age", 12);map.put("openId", "DFDFSDFWERWER");Person person = BeanUtil.fillBeanWithMap(map, new Person(), false);" w8 M! M7 H) u1 }+ D: l
BeanUtil.fillBeanWithMapIgnoreCase 使用Map填充bean,忽略大小寫
; p% E' o8 O" r, G1 H; c??yHashMap map = CollUtil.newHashMap();map.put("Name", "yxm");map.put("aGe", 12);map.put("openId", "DFDFSDFWERWER");Person person = BeanUtil.fillBeanWithMapIgnoreCase(map, new Person(), false);同時提供了map轉bean的方法,與fillBean不同的是,此處并不是傳Bean對象,而是Bean類,Hutool會自動調用默認構造方法創建對象。當然,前提是Bean類有默認構造方法(空構造),這些方法有:6 ?* C3 q( H2 k5 c+ r: o
& H0 V7 }9 y3 X9 q
mapToBean,mapToBeanIgnoreCase0 o, |( h: E; i2 @4 u// 設置別名,用于對應bean的字段名HashMap mapping = CollUtil.newHashMap();mapping.put("a_name", "name");mapping.put("b_age", "age");Person person = BeanUtil.mapToBean(map, Person.class, CopyOptions.create().setFieldMapping(mapping));Bean轉為Map
+ A. H5 }7 G??e( _, x+ g# X3 T1 [??O0 `8 ~, D; d) ~$ B
BeanUtil.beanToMap方法則是將一個Bean對象轉為Map對象。' F1 f9 N( o$ B8 e% l, [# W0 o% a; M3 ]
Person person = new Person();person.setAge(14);person.setOpenid("11213232");person.setName("測試A11");person.setSubName("sub名字");Map map = BeanUtil.beanToMap(person);Bean轉Bean( c# E( a6 U1 B. h- P/ X
8 M! h9 e4 R( `- E4 GBean之間的轉換主要是相同屬性的復制,因此方法名為copyProperties,此方法支持Bean和Map之間的字段復制。: }5 j" o0 T3 W* l7 o' f
BeanUtil.copyProperties方法同樣提供一個CopyOptions參數用于自定義屬性復制。
; q" |# i4 }$ q4 c( u" OPerson p1 = new Person();p1.setSlow(true);p1.setName("測試");p1.setSubName("sub測試");Map map = MapUtil.newHashMap();BeanUtil.copyProperties(p1, map);PmsBrand brand = new PmsBrand();brand.setId(1L);brand.setName("小米");brand.setShowStatus(0);//Bean轉MapMap map = BeanUtil.beanToMap(brand);//Map轉BeanPmsBrand mapBrand = BeanUtil.mapToBean(map, PmsBrand.class, false);//Bean屬性拷貝PmsBrand copyBrand = new PmsBrand();BeanUtil.copyProperties(brand, copyBrand);6. ReflectUtil
3 e, t. Z7 B1 x6 I0 T0 b& P* O! [& y* z" C: ~0 J1 v2 O/ b
Java反射工具類,可用于反射獲取類的方法及創建對象。* S2 ^: D( s" t* g" Z6 h( j4 c; S
//獲取某個類的所有方法Method[] methods = ReflectUtil.getMethods(PmsBrand.class);//獲取某個類的指定方法Method method = ReflectUtil.getMethod(PmsBrand.class, "getId");//使用反射來創建對象PmsBrand pmsBrand = ReflectUtil.newInstance(PmsBrand.class);//反射執行對象的方法ReflectUtil.invoke(pmsBrand, "setId", 1);7. CollUtil6 \/ `: u7 ]8 ?, j( p: ^
, G# B2 }+ I" t& x% b6 m; m( M" K0 ~5 `集合操作的工具類,定義了一些常用的集合操作。
; D/ a& `- O; s- h( E//數組轉換為列表String[] array = new String[]{"a", "b", "c", "d", "e"};List list = CollUtil.newArrayList(array);//join:數組轉字符串時添加連接符號String joinStr = CollUtil.join(list, ",");//將以連接符號分隔的字符串再轉換為列表List splitList = StrUtil.split(joinStr, ',');//創建新的Map、Set、ListHashMap newMap = CollUtil.newHashMap();HashSet newHashSet = CollUtil.newHashSet();ArrayList newList = CollUtil.newArrayList();//判斷列表是否為空CollUtil.isEmpty(list);8. MapUtil. H0 E+ ^0 u0 y3 M7 e: S
% b" E$ x5 v' i2 j
Map操作工具類,可用于創建Map對象及判斷Map是否為空。& G" \& g/ e* s/ e6 z& _
//將多個鍵值對加入到Map中Map map = MapUtil.of(new String[][]{? ? {"key1", "value1"},? ? {"key2", "value2"},? ? {"key3", "value3"}});//判斷Map是否為空MapUtil.isEmpty(map);MapUtil.isNotEmpty(map);9. AnnotationUtil
% C6 y; r3 ~. j8 g1 {. }# Z
' j, a$ x; V8 |/ j/ H; a注解工具類,可用于獲取注解與注解中指定的值。4 g! E??|4 K3 H: h" }, d# O
//獲取指定類、方法、字段、構造器上的注解列表Annotation[] annotationList = AnnotationUtil.getAnnotations(HutoolController.class, false);//獲取指定類型注解Api api = AnnotationUtil.getAnnotation(HutoolController.class, Api.class);//獲取指定類型注解的值Object annotationValue = AnnotationUtil.getAnnotationValue(HutoolController.class, RequestMapping.class);10. SecureUtil- g8 l1 |+ c. |# }2 `
8 ]8 A1 F) |3 h+ O2 u& B加密解密工具類,可用于MD5加密。
6 _, b" u/ l% Y- j4 E" ?//MD5加密String str = "123456";String md5Str = SecureUtil.md5(str);LOGGER.info("secureUtil md5:{}", md5Str);其他工具類# N2 o) p8 |) u
, ^; U: p- H) r8 |# q# E
Hutool中的工具類很多,可以參考:https://www.hutool.cn/
; g* c) d) E8 r& p9 A9 G' [四、項目源碼地址
* }8 a" Y* ~( f) [# ?! B( T/ D& s" c& V
https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-hutool
1 e! \4 h" Y7 b4 d9 h8 F* ???I" X; L4 z6 O. w
Java吧 收集整理 java論壇 www.java8.com
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的hutool中的threadutil_Hutool - 好用的Java工具类库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回归分析残差不满足正态分布_线性回归思路
- 下一篇: 已经无法合并还报请合并git_GIT 分