“最後,我會告訴你關於 Map 的事。”
“Map,如你所知,存儲了一組鍵值對。鍵必須是唯一的,但值可以是任何東西。如果你在一個Map中添加一個鍵值對,並且集合已經包含鍵,那麼舊值將被新值替換。換句話說,鍵就像一個特殊的索引,可以是任何對象。”
映射是一個數學術語,表示一組 (x, y) 對,其中每個唯一的 x 對應於一些 y。
程序員非常喜歡 Map,所以這裡我們展示了 4 個實現 Map 接口的不同集合:
“這是它的簡單繼承結構:”
“黃色表示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 類,你還能告訴我什麼?”
“這個類描述了一對元素。它有幾個方法:”
方法 | 描述 |
---|---|
K getKey() |
返回鍵值對的鍵。 |
V getValue() |
返回鍵值對的值。 |
V 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 時。”
“我相信你,你說的都對,那你就放心吧,晚上見。”
“再見,艾莉。”
GO TO FULL VERSION