<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [AbstractMapBasedMultimap](http://www.iteblog.com/archives/tag/abstractmapbasedmultimap "查看 AbstractMapBasedMultimap 中的全部文章")源碼分析:[AbstractMapBasedMultimap](http://www.iteblog.com/archives/tag/abstractmapbasedmultimap "查看 AbstractMapBasedMultimap 中的全部文章")是[Multimap](http://www.iteblog.com/archives/tag/multimap "查看 Multimap 中的全部文章")接口的基礎實現類,實現了[Multimap](http://www.iteblog.com/archives/tag/multimap "查看 Multimap 中的全部文章")中的絕大部分方法,其中有許多的方法還是靠實現類的具體實現,比如size()方法,其計算方法在不同實現是不一樣的。同時,[AbstractMapBasedMultimap](http://www.iteblog.com/archives/tag/abstractmapbasedmultimap "查看 AbstractMapBasedMultimap 中的全部文章")類也定義了自己的一些方法,比如createCollection()。AbstractMapBased[Multimap](http://www.iteblog.com/archives/tag/multimap "查看 Multimap 中的全部文章")類中主要存在以下兩個成員變量 ~~~ private transient Map<K, Collection<V>> map; private transient int totalSize; ~~~ map是存放所有的鍵值對;totalSize是存放所有值的數量。 AbstractMapBasedMultimap類將multimap轉換為一個map,所有的元素都是存放在Map<k ,="" collection> map數據結構中,如下圖所示: ![](https://box.kancloud.cn/2016-05-17_573adb38be183.jpg) Guava中AbstractMapBasedMultimap源碼 所有實現Multimap接口的子類必須實現createCollection()方法,用于存放value的值。當需要向map中插入一對key→value鍵值對,而這個key不存在于multimap中,此時就需要調用createCollection()方法來創建一個新的Collection以便存放這個key對應的value。根據createCollection()方法的不同實現,使得同一個key中的value可以相同或者不同,比如ArrayListMultimap類重寫createCollection()方法如下: ~~~ @Override List<V> createCollection() { return new ArrayList<V>(expectedValuesPerKey); } ~~~ TreeMultimap類重寫createCollection()方法如下: ~~~ @Override SortedSet<V> createCollection() { return new TreeSet<V>(valueComparator); } ~~~ 所以,下面代碼輸出的結果是不一樣的: ~~~ TreeMultimap<Comparable, Comparable> comparableComparableTreeMultimap = TreeMultimap.create(); comparableComparableTreeMultimap.put("wyp", "xxx"); comparableComparableTreeMultimap.put("wyp", "xxx"); System.out.println(comparableComparableTreeMultimap); ArrayListMultimap<Object, Object> objectObjectArrayListMultimap = ArrayListMultimap.create(); objectObjectArrayListMultimap.put("wyp", "xxx"); objectObjectArrayListMultimap.put("wyp", "xxx"); System.out.println(objectObjectArrayListMultimap); ~~~ 輸出結果分別為: ~~~ {wyp=[xxx]} {wyp=[xxx, xxx]} ~~~ 因為ArrayListMultimap類中存儲value是用ArrayList實現的,所以ArrayListMultimap中同一個key中可以存放相同的value;而TreeMultimap類中存儲value是用TreeSet實現的,我們知道,TreeSet是不同存放相同的值,所以導致了TreeMultimap中同一個key不能存放相同的value,所以才會有上面的輸出。 上面提到,AbstractMapBasedMultimap類中主要有map和totalSize兩個成員變量,這里需要對totalSize做個說明,如下程序: ~~~ ArrayListMultimap<Object, Object> objectObjectArrayListMultimap = ArrayListMultimap.create(); objectObjectArrayListMultimap.put("a", "1"); objectObjectArrayListMultimap.put("a", "2"); objectObjectArrayListMultimap.put("b", "3"); System.out.println(objectObjectArrayListMultimap); System.out.println(objectObjectArrayListMultimap.size()); ~~~ 輸出的結果為: ~~~ {b=[3], a=[1, 2]} 3 ~~~ 是不是很奇怪?objectObjectArrayListMultimap.size()為什么輸出的是3,而不是2?先看看size()函數的實現: ~~~ @Override public int size() { return totalSize; } ~~~ 而totalSize的值計算可以用下面程序來說明 ~~~ totalSize = 0; for (Collection<V> values : map.values()) { checkArgument(!values.isEmpty()); totalSize += values.size(); } ~~~ 看到這里應該很明白,為什么上面的結果返回的是3,而不是2。因為totalSize計算的是所有value的個數,而不是所有key的個數。從代碼中可以看出,所有對map中元素的添加和刪除都會對totalSize作出相應的加減處理,而這些加減是針對value數量的變化。 **轉載請注明: 轉載自[過往記憶(http://www.iteblog.com/)](http://www.iteblog.com/) 本文鏈接地址:?[Guava學習之AbstractMapBasedMultimap(http://www.iteblog.com/archives/701)](http://www.iteblog.com/archives/701)**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看