別再重復造輪子了,推薦使用 Google Guava 開源工具類庫,真心強大!
點擊關注公眾號,Java干貨及時送達

2、guava github 開源地址:GitHub - google/guava:
??com.google.guava
??guava
??29.0-jre
不可變集合與對象
1、制作對象的不可變副本是一種很好的防御性編程技術,不可變對象有許多優(yōu)點,包括:
可供不受信任的庫安全使用。 線程安全:可由多個線程使用,無爭用風險。 不需要支持突變,并且可以節(jié)省時間和空間,所有不可變的集合實現(xiàn)都比它們的可變同級更節(jié)省內存。 可以用作常數(shù),并期望它將保持不變。 最新面試題大家可以在Java面試庫小程序在線刷題。
2、要點:每個 Guava 不可變集合實現(xiàn)都拒絕 null 值。Guava 的設計上推薦使用 null 值,大多數(shù)情況下,遇到 null 值會拋異常.
3、一個不可變的 ImmutableXxx 集合可以通過以下幾種方式創(chuàng)建:
使用 copyOf 方法,如 ImmutableSet.copyOf(set)使用 of 方法, 如 ImmutableSet.of("a", "b", "c")或ImmutableMap.of("a", 1, "b", 2)使用 Builder 方法,。
4、Guava 為 java jdk 每種標準集合類型提供了簡單易用的不可變版本,包括 Guava 自己的集合變體,為 java 提供的不可變版本都是繼承 java jdk 的接口而來,所以操作上基本無異。下面接口的實現(xiàn)類也都有對應的不可變版本。
| 接口 | JDK 或者 Guava | 不可變版本 |
|---|---|---|
| Collection | JDK | ImmutableCollection |
| List | JDK | ImmutableList |
| Set | JDK | ImmutableSet |
| SortedSet/NavigableSet | JDK | ImmutableSortedSet |
| Map | JDK | ImmutableMap |
| SortedMap | JDK | ImmutableSortedMap |
| Multiset | Guava | ImmutableMultiset |
| SortedMultiset | Guava | ImmutableSortedMultiset |
| Multimap | Guava | ImmutableMultimap |
| ListMultimap | Guava | ImmutableListMultimap |
| SetMultimap | Guava | ImmutableSetMultimap |
| BiMap | Guava | ImmutableBiMap |
| ClassToInstanceMap | Guava | ImmutableClassToInstanceMap |
| Table | Guava | ImmutableTable |
在線演示源碼:
https://github.com/main/java/com/wmx/guava/ImmutableCollectionTest.java
官網(wǎng)文檔
https://github.com/google/guava/wiki/ImmutableCollectionsExplained
推薦一個 Spring Boot 基礎教程及實戰(zhàn)示例:
https://github.com/javastacks/spring-boot-best-practice
Guava 新集合類型
1、Guava 引入了許多新的集合類型,這些類型不在 Java JDK 中,但卻非常有用,這些都是為了與 JDK 集合框架愉快地共存而設計的,而不是將東西塞進 JDK 集合抽象中。
Multiset 可重復集合
1、Guava 提供了一個新的集合類型 Multiset,它支持添加多個相同的元素,其中成員可以出現(xiàn)不止一次。
2、Multiset 相當于 Set,區(qū)別在于 Multiset 可添加相同的元素,它的內部使用一個 HashMap 來維護,
3、Multiset 也有自己的實現(xiàn)類,常用的有 HashMultiset、LinkedHashMultiset、TreeMultiset 等,HashMultiset 、TreeMultiset 是無序的,LinkedHashMultiset 是有序的,操作完全同理 JDK 的 HashSet、TreeSet、LinkedHashSet。
在線演示源碼
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/MultisetTest.java
Multimap 多重映射
1、每個有經驗的 Java 程序員都曾在某個地方實現(xiàn)過 Map或 Map,Guava 的 Multimap 框架使處理從鍵到多個值的映射變得容易,多重映射是將鍵與任意多個值關聯(lián)的一種通用方法。
2、從概念上講,有兩種方法可以將多重映射視為從單個鍵到單個值的映射的集合:

3、Multimap 提供了多種實現(xiàn):
| Multimap | 實現(xiàn) key 使用的是 | value 使用的是 |
|---|---|---|
| ArrayListMultimap | HashMap | ArrayList |
| HashMultimap | HashMap | HashSet |
| LinkedListMultimap * | LinkedHashMap* | LinkedList* |
| LinkedHashMultimap** | LinkedHashMap | LinkedHashSet |
| TreeMultimap | TreeMap | TreeSet |
| ImmutableListMultimap | ImmutableMap | ImmutableList |
| ImmutableSetMultimap | ImmutableMap | ImmutableSet |
4、除了不可變的實現(xiàn)之外,每個實現(xiàn)都支持空鍵和值。并不是所有的實現(xiàn)都是作為一個Map實現(xiàn)的(特別是一些Multimap實現(xiàn)使用自定義哈希表來最小化開銷。)最新面試題大家可以在Java面試庫小程序在線刷題。
在線演示源碼
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/MultimapTest.java
推薦一個 Spring Boot 基礎教程及實戰(zhàn)示例:
https://github.com/javastacks/spring-boot-best-practice
BiMap 雙向映射
1、將值映射回鍵的傳統(tǒng)方法是維護兩個獨立的映射,并使它們保持同步,但這很容易產生錯誤,并且當映射中已經存在一個值
Map?nameToId?=?Maps.newHashMap();
Map?idToName?=?Maps.newHashMap();
nameToId.put("Bob",?42);
idToName.put(42,?"Bob");
2、BiMap 提供了多種實現(xiàn):
| 鍵值映射實現(xiàn) | 值鍵映射實現(xiàn) | 對應BiMap |
|---|---|---|
| HashMap | HashMap | HashBiMap |
| ImmutableMap | ImmutableMap | ImmutableBiMap |
| EnumMap | EnumMap | EnumBiMap |
| EnumMap | HashMap | EnumHashBiMap |
在線演示源碼:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/BiMapTest.java
Table 表結構數(shù)據(jù)
1、當試圖一次在多個鍵上建立索引時,您將得到類似 Map的代碼,這很難看,而且使用起來很尷尬。Guava 提供了一個新的集合類型 Table,它支持任何“row”類型和“column”類型的這個用例。
2、Table 提供了多種實現(xiàn):
HashBasedTable:基本上是由 HashMap支持的。> TreeBasedTable:基本上是由 TreeMap支撐的。> ImmutableTable ArrayTable:要求在構造時指定行和列的完整范圍,但在表密集時由二維數(shù)組支持以提高速度和內存效率,ArrayTable的工作原理與其他實現(xiàn)有些不同
在線演示源碼:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/TableTest.java
ClassToInstanceMap 類型映射到實例
1、有時 key 并不是單一的類型,而是多種類型,Guava 為此提供了 ClassToInstanceMap,key 可以是多種類型,value 是此類型的實例。
2、ClassToInstanceMap 的實現(xiàn)有:MutableClassToInstanceMap 和 ImmutableClassToInstanceMap 的實現(xiàn)。
在線演示源碼:
https://github.com/wangmaoxiong/src/main/java/com/wmx/guava/ClassToInstanceMapTest.java
JDK 集合輔助工具類
1、任何有 JDK 集合框架經驗的程序員都知道并喜歡其中提供的實用程序 java.util.Collections,Guava 提供了許多適用于集合的靜態(tài)方法實用程序。
| 接口 | 屬于 JDK 還是 Guava | 對應 Guava API |
|---|---|---|
| Collection | JDK | Collections2 |
| List | JDK | Lists |
| Set | JDK | Sets |
| SortedSet | JDK | Sets |
| Map | JDK | Maps |
| SortedMap | JDK | Maps |
| Queue | JDK | Queues |
| Multiset | Guava | Multisets |
| Multimap | Guava | Multimaps |
| BiMap | Guava | Maps |
| Table | Guava | Tables |
Lists 在線演示:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/ListsTest.java
Sets 在線演示:
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/SetsTest.java
JDK 基本類型輔助工具類
1、Guava 為 Java JDK 的基本類型提供了實用程序類:
| 基本類型 | Guava 輔助工具類 |
|---|---|
| byte | Bytes, SignedBytes, UnsignedBytes |
| short | Shorts |
| int | Ints, UnsignedInteger, UnsignedInts |
| long | Longs, UnsignedLong, UnsignedLongs |
| float | Floats |
| double | Doubles |
| char | Chars |
| boolean | Booleans |
https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/IntsTest.java
https://github.com/src/main/java/com/wmx/guava/DoublesTest.java
https://github.com/src/main/java/com/wmx/guava/BooleansTest.java
JDK 字符串輔助工具類
1、Strings 類中提供了少數(shù)幾個常用的符串實用程序。
在線演示源碼:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/StringsTest.java
2、Joiner 是連接器,用于連接 java.lang.Iterable、java.util.Iterator、java.lang.Object[] 中的元素。
在線演示源碼:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/JoinerTest.java
3、Splitter 是分割器,用于分割字符序列 java.lang.CharSequence。
在線演示源碼:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/SplitterTest.java
4、CharMatcher 字符匹配器,用于匹配字符,可以將 CharMatcher 視為代表一類特定的字符,如數(shù)字或空白。注意:CharMatcher 只處理 char 值。
在線演示源碼:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/CharMatcherTest.java
Stopwatch 秒表
1、google 的秒表 Stopwatch 相比 Spring framewrk core 包 和 apache commons lang3 包的秒表是最方便使用的。
/**
?* Stopwatch createStarted():創(chuàng)建(并啟動)一個新的秒表,使用 System#nanoTime 來作為其時間源。
?* Stopwatch createUnstarted():創(chuàng)建(但不啟動)一個新的秒表,使用 System#nanoTime 來作為其時間源。
?* long elapsed(TimeUnit desiredUnit):返回此秒表上顯示的當前已用時間,以所需的時間單位表示,任何分數(shù)向下舍入
?* boolean isRunning():如果已在此秒表上調用start()},并且自上次調用start()以來未調用stop(),則返回true
?* Stopwatch reset():將此秒表的運行時間設置為零,并將其置于停止狀態(tài)。
?* Stopwatch start():啟動秒表,如果秒表已經在運行,則 IllegalStateException
?* Stopwatch stop():停止秒表,將來的讀取將返回到目前為止經過的固定持續(xù)時間。
?* tring toString():返回當前運行時間的字符串表示形式,比如 2.588 s,106.8 ms
?*/
@Test
public?void?testStopwatch()?throws?InterruptedException?{
????SecureRandom?secureRandom?=?new?SecureRandom();
????Stopwatch?stopwatch?=?Stopwatch.createStarted();
????int?nextInt?=?secureRandom.nextInt(2000);
????System.out.println("任務1預算耗時:"?+ nextInt);//任務1預算耗時:81
????TimeUnit.MILLISECONDS.sleep(nextInt);
????System.out.println("\t任務1實際耗時:"?+?stopwatch.elapsed(TimeUnit.MILLISECONDS)?+?"(毫秒)");//?任務1實際耗時:563(毫秒)
????stopwatch.reset().start();
????nextInt?=?secureRandom.nextInt(4000);
????System.out.println("任務2預算耗時:"?+ nextInt);//任務2預算耗時:1591
????TimeUnit.MILLISECONDS.sleep(nextInt);
????System.out.println("\t任務2實際耗時:"?+ stopwatch.toString());//?任務2實際耗時:1.592 s
????stopwatch.reset().start();
????nextInt?=?secureRandom.nextInt(3000);
????System.out.println("任務3預計耗時:"?+ nextInt);//任務3預計耗時:1964
????TimeUnit.MILLISECONDS.sleep(nextInt);
????System.out.println("\t任務3實際耗時:"?+ stopwatch.stop().toString());//?任務3實際耗時:1.965 s
}
覺得不錯,就用起來吧!
版權聲明:本文為CSDN博主「蚩尤后裔」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/wangmx1993328/article/details/103533060
????
往 期 推 薦
1、拖動文件就能觸發(fā)7-Zip安全漏洞,波及所有版本
3、一次 SQL 查詢優(yōu)化原理分析:900W+ 數(shù)據(jù),從 17s 到 300ms
點分享
點收藏
點點贊
點在看





