摘要:類關系實現方法是以為的特定實現,這個類中沒有太多的實際代碼,主要是方法中特定的產生一個作為。是的一個專有版本,這個類和接口一起,將的方法都重寫為。則是所有以為核心的的基本實現,這里實現了所有的方法,是最重要的一部分。
類關系
ArrayListMultiMap.java
Multimap | | AbstractMultimap Serializable |__________________________________________| | AbstractMapBasedMultimap | | AbstractListMultimap ListMultimap |__________________________________________| | ArrayListMultiMap
LinkedListMultiMap.java
Multimap | | AbstractMultimap ListMultimap Serializable |__________________________________________|______________________________| | LinkedListMultimap
TreeMultimap.java
Multimap | | AbstractMultimap Serializable |__________________________________________| | AbstractMapBasedMultimap SetMultimap |__________________________________________| | AbstractSetMultimap SortedSetMultimap |__________________________________________| | AbstractSortedSetMultimap | | AbstractSortedKeySortedSetMultimap | | TreeMultimap實現方法 ArrayListMultimap
ArrayListMultiMap.java是以ArrayList為Collection的特定實現,這個類中沒有太多的實際代碼,主要是createCollection()方法中特定的產生一個ArrayList作為Collection。
AbstractListMultimap.java是AbstractMultimap的一個List專有版本,這個類和ListMultimap接口一起,將Multimap的方法都重寫為List。
AbstractMapBasedMultimap.java則是所有以Map為核心的Multimap的基本實現,這里實現了所有Multimap的方法,是最重要的一部分。
clear方法,先將每個collection清空,再把map清空
public void clear() { // Clear each collection, to make previously returned collections empty. for (Collectioncollection : map.values()) { collection.clear(); } map.clear(); totalSize = 0; }
put方法,我們可以發現這里的size是每多一個KV對就加1,而不是唯一Key的數量,這點和Map不同
public boolean put(@Nullable K key, @Nullable V value) { Collectioncollection = map.get(key); // 如果這是一個新key沒有對應的Collection if (collection == null) { // 先根據子類實現創建一個相應的Collection collection = createCollection(key); // 將KV對加入Map中 if (collection.add(value)) { totalSize++; map.put(key, collection); return true; } else { throw new AssertionError("New Collection violated the Collection spec"); } // 如果已經有這個key了,就加入它的Collection } else if (collection.add(value)) { totalSize++; return true; } else { return false; } }
removeAll方法,需要返回刪除的Value,所以要一個臨時變量存起來
public CollectionremoveAll(@Nullable Object key) { // 先將Key移出 Collection collection = map.remove(key); // 如果Value為空,則返回空集合 if (collection == null) { return createUnmodifiableEmptyCollection(); } // 否則將Value的值拷貝到輸出集合中,再把Value清空 Collection output = createCollection(); output.addAll(collection); totalSize -= collection.size(); collection.clear(); // 返回輸出集合 return unmodifiableCollectionSubclass(output); }
size方法,注意這里返回的是KV數,而非K的唯一個數
public int size() { return totalSize; }
isEmpty方法,判斷KV數是否為0
public boolean isEmpty() { return size() == 0; }
get方法
public Collectionget(@Nullable K key) { Collection collection = map.get(key); // 如果沒有Value就新建一個Collection if (collection == null) { collection = createCollection(key); } return wrapCollection(key, collection); }
AbstractMultimap.java也實現了一些基本方法,和上一個文件一起涵蓋了所有API
remove方法
public boolean remove(@Nullable Object key, @Nullable Object value) { // 從Map中按照key找到該集合 Collectioncollection = asMap().get(key); // 如果集合不為空,則找到集合中的這個值并刪除 return collection != null && collection.remove(value); }
putAll方法,以key為第一參數,以一個Iterable為第二參數
public boolean putAll(@Nullable K key, Iterable extends V> values) { checkNotNull(values); // make sure we only call values.iterator() once // and we only call get(key) if values is nonempty if (values instanceof Collection) { Collection extends V> valueCollection = (Collection extends V>) values; // 拿出Collection然后把新的addAll進去 return !valueCollection.isEmpty() && get(key).addAll(valueCollection); } else { Iterator extends V> valueItr = values.iterator(); // 拿出Iterator然后把新的addAll進去 return valueItr.hasNext() && Iterators.addAll(get(key), valueItr); } }
putAll方法,以另一個Multimap為參數
public boolean putAll(Multimap extends K, ? extends V> multimap) { boolean changed = false; for (Map.Entry extends K, ? extends V> entry : multimap.entries()) { changed |= put(entry.getKey(), entry.getValue()); } return changed; }
replace方法
public CollectionreplaceValues(@Nullable K key, Iterable extends V> values) { checkNotNull(values); // 先移除所有 Collection result = removeAll(key); // 在加入新的值 putAll(key, values); return result; }
containsValue方法
public boolean containsValue(@Nullable Object value) { // 檢查每一個Collection是否有這個值 for (Collectioncollection : asMap().values()) { if (collection.contains(value)) { return true; } } return false; }
containsEntry方法,實際上是用get來判斷是否有這個key,然后再看是否有這個值
public boolean containsEntry(@Nullable Object key, @Nullable Object value) { Collectioncollection = asMap().get(key); return collection != null && collection.contains(value); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64679.html
摘要:它主要做了件事初始化容器,并將元素添加到容器里維護這樣我們再調用的方法直接就返回了,不需要再次遍歷和統計的過程。維護實時的維護,及時刪除總結整體上是對底層的二次封裝,很好的處理了各種細節,比如子容器的判空處理,的計算效率,的維護等。 在日常開發中我們通常有需要對 List 容器進行分組的情況,比如對下面的list數據根據name字段來進行分組: [ { date...
摘要:今天逛了逛,順手精選出了一下近幾個月以來上最熱門的個項目。相關閱讀正式開源,幫助應用快速容器化未來可能會上熱門的項目地址介紹哈哈,皮一下很開心。這是我自己開源的一份文檔,目前仍在完善中,歡迎各位英雄好漢一起完善。 showImg(https://segmentfault.com/img/remote/1460000015766827?w=391&h=220);今天逛了逛Github,順...
摘要:設計模式可以通過提供經過驗證的經過驗證的開發范例來加速開發過程。將流程作為突破點,并在多個領域工作,包括流量控制,并發,斷路和負載保護,以保護服務穩定性。 1. JCSprout(Java核心知識庫) Github地址: https://github.com/crossoverJie/JCSprout star: 12k 介紹: 處于萌芽階段的 Java 核心知識庫。 2....
摘要:配合一下方法使用類似的方法,用于提取一個里頭的一個屬性出來。當然,也可以簡寫為主要用來過濾集合。配合使用功能與相同,只是把該篩選條件內置在中然后這里直接使用,傳入參數與功能相反集合分區只取出一個符合條件的計數與條件滿足判斷其他轉參考 Function 配合一下方法使用: collect flatCollect groupBy minBy maxBy toSortedListBy so...
摘要:緩存本次主要討論緩存。清除數據時的回調通知。具體不在本次的討論范圍。應該是以下原因新起線程需要資源消耗。維護過期數據還要獲取額外的鎖,增加了消耗。 showImg(https://segmentfault.com/img/remote/1460000015272232); 前言 Google 出的 Guava 是 Java 核心增強的庫,應用非常廣泛。 我平時用的也挺頻繁,這次就借助日...
閱讀 2609·2021-11-17 17:00
閱讀 1863·2021-10-11 10:57
閱讀 3716·2021-09-09 11:33
閱讀 911·2021-09-09 09:33
閱讀 3550·2019-08-30 14:20
閱讀 3311·2019-08-29 11:25
閱讀 2796·2019-08-26 13:48
閱讀 734·2019-08-26 11:52