“最後,我會告訴你關於 Map 的事。”

“Map,如你所知,存儲了一組鍵值對。鍵必須是唯一的,但值可以是任何東西。如果你在一個Map中添加一個鍵值對,並且集合已經包含鍵,那麼舊值將被新值替換。換句話說,鍵就像一個特殊的索引,可以是任何對象。”

映射是一個數學術語,表示一組 (x, y) 對,其中每個唯一的 x 對應於一些 y。

程序員非常喜歡 Map,所以這裡我們展示了 4 個實現 Map 接口的不同集合:

“這是它的簡單繼承結構:”

地圖層次 - 1

“黃色表示Entry是Map界面中的一個嵌套界面。”

“添加條目以將元素對描述為單個實體。”

“這是 Map<K,V> 的方法:”

方法 描述
int size() 返回映射中的對數。
boolean isEmpty() 檢查地圖是否為空。
boolean containsKey(Object key) 地圖是否包含指定的鍵?
boolean containsValue(Object value) 地圖是否包含指定值?
V get(Object key) 返回指定鍵的值。
V put(K key, V value) 為鍵設置一個新值。
該方法返回舊值或 null
putAll(Map<? extends K, ? extends V> m) 從另一張地圖添加對。
void clear() 清除地圖,即刪除所有對。
Set<K>keySet() 返回一組鍵。
Collection<V>values() 返回值的集合。
Set<Map.Entry<K, V>>entrySet() 返回一組對。

“K 和 V 是鍵和值的類型參數。”

“嗯,大部分方法我都熟悉,但我只用過其中的一部分。”

“關於 Entry 類,你還能告訴我什麼?”

“這個類描述了一對元素。它有幾個方法:”

方法 描述
getKey() 返回鍵值對的鍵。
getValue() 返回鍵值對的值。
setValue(V value) 在鍵值對中設置一個新值。

“入口很方便,因為你可以將一對傳遞給一個方法,而無需傳遞整個地圖。”

“我懂了。”

“現在我將介紹 Map 實現。”

“首先是HashMap。它使用哈希表來存儲元素。鍵和值可以是任何類型,也可以是空值。元素的順序可以隨著集合的變化而變化。”

“元素作為一組組或桶存儲在 HashMap 中。元素的 hashCode() 方法確定它屬於哪個桶。”

“非常粗略地說,哈希碼從 1 到 100 的元素落入第一個桶,值從 101 到 200 的元素落入第二個桶,依此類推。”

“這樣存儲元素的意義在於,我們在搜索或刪除元素時,可以將不相關的桶中的元素全部刪除。”

“我懂了。”

“關於 HashMap 有一篇非常好的文章。我建議您閱讀它: https: //medium.com/@mr.anmolsehgal/java-hashmap-internal-implementation-21597e1efec3

“第二個集合是LinkedHashMap。它與 HashMap 的主要區別在於它也將項目存儲為鍊錶。在普通的 HashMap 中,元素的順序是未定義的,可能會隨著時間的推移而改變。你可以從 LinkedHashMap 得到一個迭代器並使用它按照添加到 LinkedHashMap 的順序遍歷所有元素。此外,LinkedHashMap 有一個迭代器,可以讓您按照上次使用/活動的順序遍歷所有對。”

“關於 LinkedHashMap 有一篇非常好的文章。給你:https://medium.com/@mr.anmolsehgal/java-linkedhashmap-internal-implementation-44e2e2893036

“我今天要談的第三個集合是TreeMap。”

TreeMap保持其元素按升序排序。這是由於 TreeMap 使用平衡的紅黑樹來存儲元素這一事實實現的。”

“因此,插入時間和搜索時間非常短。當使用大量數據時,此類是一個很好的選擇。”

“當然,我們有一篇關於 TreeMap 的文章:https://medium.com/xebia-engineering/treemap-internals-199e0e0050b5

“我還有什麼沒告訴你的?”

“WeakHashMap,但 Rishi 幾天前告訴我了。”

“那是什麼時候?”

“當他談到 SoftReference、WeakReference 和 PhantomReference 時。”

“我相信你,你說的都對,那你就放心吧,晚上見。”

“再見,艾莉。”