<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          別再造輪子了,推薦使用 Google Guava 開源工具類庫,真心強大!

          共 7504字,需瀏覽 16分鐘

           ·

          2022-05-18 20:37

          點擊下方“IT牧場”,選擇“設(shè)為星標(biāo)”

          目錄

          • Google Guava 概述

          • 不可變集合與對象

          • Guava 新集合類型

          • JDK 集合輔助工具類

          • JDK 基本類型輔助工具類

          • JDK 字符串輔助工具類

          • Stopwatch 秒表


          Google Guava 概述

          1、Guava 是一組來自 Google 的核心 Java 庫,包括新的集合類型(如 multimap 和 multiset)、不可變集合、圖形庫以及用于并發(fā)、I/O、散列、緩存、原語、字符串等的實用程序!被廣泛應(yīng)用于 Google 的大多數(shù) Java 項目中,也被許多其他公司廣泛使用。

          2、guava github 開源地址:GitHub - google/guava:?https://github.com/google/guava

          3、官網(wǎng)用戶手冊:https://github.com/google/guava/wiki

          4、com.google.guava 依賴:

          <dependency>
          ??<groupId>com.google.guavagroupId>
          ??<artifactId>guavaartifactId>
          ??<version>29.0-jreversion>
          dependency>

          不可變集合與對象

          1、制作對象的不可變副本是一種很好的防御性編程技術(shù),不可變對象有許多優(yōu)點,包括:

          • 可供不受信任的庫安全使用。

          • 線程安全:可由多個線程使用,無爭用風(fēng)險。

          • 不需要支持突變,并且可以節(jié)省時間和空間,所有不可變的集合實現(xiàn)都比它們的可變同級更節(jié)省內(nèi)存。

          • 可以用作常數(shù),并期望它將保持不變。

          2、要點:每個 Guava 不可變集合實現(xiàn)都拒絕 null 值。Guava 的設(shè)計上推薦使用 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 每種標(biāo)準(zhǔn)集合類型提供了簡單易用的不可變版本,包括 Guava 自己的集合變體,為 java 提供的不可變版本都是繼承 java jdk 的接口而來,所以操作上基本無異。下面接口的實現(xiàn)類也都有對應(yīng)的不可變版本。

          接口JDK 或者 Guava不可變版本
          CollectionJDKImmutableCollection
          ListJDKImmutableList
          SetJDKImmutableSet
          SortedSet/NavigableSetJDKImmutableSortedSet
          MapJDKImmutableMap
          SortedMapJDKImmutableSortedMap
          MultisetGuavaImmutableMultiset
          SortedMultisetGuavaImmutableSortedMultiset
          MultimapGuavaImmutableMultimap
          ListMultimapGuavaImmutableListMultimap
          SetMultimapGuavaImmutableSetMultimap
          BiMapGuavaImmutableBiMap
          ClassToInstanceMapGuavaImmutableClassToInstanceMap
          TableGuavaImmutableTable

          在線演示源碼:https://github.com/main/java/com/wmx/guava/ImmutableCollectionTest.java

          官網(wǎng)文檔:https://github.com/google/guava/wiki/ImmutableCollectionsExplained

          Guava 新集合類型

          1、Guava 引入了許多新的集合類型,這些類型不在 Java JDK 中,但卻非常有用,這些都是為了與 JDK 集合框架愉快地共存而設(shè)計的,而不是將東西塞進 JDK 集合抽象中。

          Multiset 可重復(fù)集合

          1、Guava 提供了一個新的集合類型 Multiset,它支持添加多個相同的元素,其中成員可以出現(xiàn)不止一次。

          2、Multiset 相當(dāng)于 Set,區(qū)別在于 Multiset 可添加相同的元素,它的內(nèi)部使用一個 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、每個有經(jīng)驗的 Java 程序員都曾在某個地方實現(xiàn)過?Map>?或?Map>,Guava 的?Multimap?框架使處理從鍵到多個值的映射變得容易,多重映射是將鍵與任意多個值關(guān)聯(lián)的一種通用方法。

          2、從概念上講,有兩種方法可以將多重映射視為從單個鍵到單個值的映射的集合:

          3、Multimap 提供了多種實現(xiàn):

          Multimap實現(xiàn) key 使用的是value 使用的是
          ArrayListMultimapHashMapArrayList
          HashMultimapHashMapHashSet
          LinkedListMultimap *LinkedHashMap*LinkedList*
          LinkedHashMultimap**LinkedHashMapLinkedHashSet
          TreeMultimapTreeMapTreeSet
          ImmutableListMultimapImmutableMapImmutableList
          ImmutableSetMultimapImmutableMapImmutableSet

          4、除了不可變的實現(xiàn)之外,每個實現(xiàn)都支持空鍵和值。并不是所有的實現(xiàn)都是作為一個Map>實現(xiàn)的(特別是一些Multimap實現(xiàn)使用自定義哈希表來最小化開銷。)

          在線演示源碼:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/MultimapTest.java

          BiMap 雙向映射

          1、將值映射回鍵的傳統(tǒng)方法是維護兩個獨立的映射,并使它們保持同步,但這很容易產(chǎn)生錯誤,并且當(dāng)映射中已經(jī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)對應(yīng)BiMap
          HashMapHashMapHashBiMap
          ImmutableMapImmutableMapImmutableBiMap
          EnumMapEnumMapEnumBiMap
          EnumMapHashMapEnumHashBiMap

          在線演示源碼:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/BiMapTest.java

          Table 表結(jié)構(gòu)數(shù)據(jù)

          1、當(dāng)試圖一次在多個鍵上建立索引時,您將得到類似?Map>?的代碼,這很難看,而且使用起來很尷尬。Guava 提供了一個新的集合類型 Table,它支持任何“row”類型和“column”類型的這個用例。

          2、Table 提供了多種實現(xiàn):

          • HashBasedTable:基本上是由?HashMap>?支持的。

          • TreeBasedTable:基本上是由?TreeMap>?支撐的。

          • ImmutableTable

          • ArrayTable:要求在構(gòu)造時指定行和列的完整范圍,但在表密集時由二維數(shù)組支持以提高速度和內(nèi)存效率,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 集合框架經(jīng)驗的程序員都知道并喜歡其中提供的實用程序?java.util.Collections,Guava 提供了許多適用于集合的靜態(tài)方法實用程序。

          接口屬于 JDK 還是 Guava對應(yīng) Guava API
          CollectionJDKCollections2
          ListJDKLists
          SetJDKSets
          SortedSetJDKSets
          MapJDKMaps
          SortedMapJDKMaps
          QueueJDKQueues
          MultisetGuavaMultisets
          MultimapGuavaMultimaps
          BiMapGuavaMaps
          TableGuavaTables

          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 輔助工具類
          byteBytes, SignedBytes, UnsignedBytes
          shortShorts
          intInts, UnsignedInteger, UnsignedInts
          longLongs, UnsignedLong, UnsignedLongs
          floatFloats
          doubleDoubles
          charChars
          booleanBooleans

          nts 在線演示源碼:https://github.com/wangmaoxiong/apache-study/blob/master/src/main/java/com/wmx/guava/IntsTest.java

          doubles 在線演示源碼:https://github.com/src/main/java/com/wmx/guava/DoublesTest.java

          booleans 在線演示源碼: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.Iterablejava.util.Iteratorjava.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?包的秒表是最方便使用的。

          2、此類不是線程安全的。

          ???/**
          ?????* Stopwatch createStarted():創(chuàng)建(并啟動)一個新的秒表,使用 System#nanoTime 來作為其時間源。
          ?????* Stopwatch createUnstarted():創(chuàng)建(但不啟動)一個新的秒表,使用 System#nanoTime 來作為其時間源。
          ?????* long elapsed(TimeUnit desiredUnit):返回此秒表上顯示的當(dāng)前已用時間,以所需的時間單位表示,任何分?jǐn)?shù)向下舍入
          ?????* boolean isRunning():如果已在此秒表上調(diào)用start()},并且自上次調(diào)用start()以來未調(diào)用stop(),則返回true
          ?????* Stopwatch reset():將此秒表的運行時間設(shè)置為零,并將其置于停止?fàn)顟B(tài)。
          ?????* Stopwatch start():啟動秒表,如果秒表已經(jīng)在運行,則 IllegalStateException
          ?????* Stopwatch stop():停止秒表,將來的讀取將返回到目前為止經(jīng)過的固定持續(xù)時間。
          ?????* tring toString():返回當(dāng)前運行時間的字符串表示形式,比如 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("任務(wù)1預(yù)算耗時:"?+?nextInt);//任務(wù)1預(yù)算耗時:81
          ????????TimeUnit.MILLISECONDS.sleep(nextInt);
          ????????System.out.println("\t任務(wù)1實際耗時:"?+?stopwatch.elapsed(TimeUnit.MILLISECONDS)?+?"(毫秒)");//?任務(wù)1實際耗時:563(毫秒)
          ?
          ????????stopwatch.reset().start();
          ????????nextInt?=?secureRandom.nextInt(4000);
          ????????System.out.println("任務(wù)2預(yù)算耗時:"?+?nextInt);//任務(wù)2預(yù)算耗時:1591
          ????????TimeUnit.MILLISECONDS.sleep(nextInt);
          ????????System.out.println("\t任務(wù)2實際耗時:"?+?stopwatch.toString());//?任務(wù)2實際耗時:1.592 s
          ?
          ????????stopwatch.reset().start();
          ????????nextInt?=?secureRandom.nextInt(3000);
          ????????System.out.println("任務(wù)3預(yù)計耗時:"?+?nextInt);//任務(wù)3預(yù)計耗時:1964
          ????????TimeUnit.MILLISECONDS.sleep(nextInt);
          ????????System.out.println("\t任務(wù)3實際耗時:"?+?stopwatch.stop().toString());//?任務(wù)3實際耗時:1.965 s
          ????}

          作者:蚩尤后裔

          https://blog.csdn.net/wangmx1993328/article/details/103533060

          干貨分享

          最近將個人學(xué)習(xí)筆記整理成冊,使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)取!

          ?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動設(shè)計速成)》?007:全部?008:加技術(shù)群討論

          加個關(guān)注不迷路

          喜歡就點個"在看"唄^_^

          瀏覽 62
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  先锋成人AV | 久久伊人五月 | 无码影音先锋 | 国产大屌 | 豆花视频国产 |