“最后,我会告诉你关于 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 时。”

“我相信你,你说的都对,那你就放心吧,晚上见。”

“再见,艾莉。”