📅  最后修改于: 2023-12-03 15:16:29.979000             🧑  作者: Mango
LinkedHashMap
是一个基于 哈希表
和 链表
实现的 有序
映射表,它继承自 HashMap
,因此具有 快速的查找性能
,同时又能够保持插入顺序。因为内部维护了双向链表,所以在迭代访问时相比于 HashMap
会更加高效。
在 LinkedHashMap
的内部,它使用了一个双向链表来维护插入顺序,同时又使用了一个桶来存储所有的映射表项,桶的存储方式与 HashMap
相同,每个桶中的元素都是一个链表。在 LinkedHashMap
中,每个桶不仅仅保存了一个哈希值相同的元素,还保存了各个元素之间的顺序信息。下图是 LinkedHashMap
的简单结构图:
LinkedHashMap
类有四个构造函数:
LinkedHashMap()
:构造一个空的 LinkedHashMap
实例,其初始容量为 16
,负载因子为 0.75
,默认按照插入顺序访问元素。LinkedHashMap(int initialCapacity)
:构造一个空的 LinkedHashMap
实例,其指定的初始容量是 initialCapacity
,负载因子为 0.75
,默认按照插入顺序访问元素。LinkedHashMap(int initialCapacity, float loadFactor)
:构造一个空的 LinkedHashMap
实例,其指定的初始容量为 initialCapacity
,指定的负载因子为 loadFactor
,默认按照插入顺序访问元素。LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
:构造一个空的 LinkedHashMap
实例,其指定的初始容量为 initialCapacity
,指定的负载因子为 loadFactor
,如果 accessOrder
为 true
则表示按照访问顺序访问元素,否则表示按照插入顺序访问元素。V put(K key, V value)
:将指定的键值关系添加到 LinkedHashMap
中。void clear()
:从 LinkedHashMap
中移除所有的键值关系。V remove(Object key)
:从 LinkedHashMap
中移除指定键的键值关系。boolean containsKey(Object key)
:如果包含指定键的键值关系,则返回 true。boolean containsValue(Object value)
:如果包含指定值的键值关系,则返回 true。V get(Object key)
:返回指定键映射到的值,如果该键不存在映射关系,则返回 null。Set<Map.Entry<K,V>> entrySet()
:返回键值对的集合,可以使用 Iterator
或者 for-each
循环来遍历所有的元素。Set<K> keySet()
:返回 LinkedHashMap
中的键集合,可以使用 Iterator
或者 for-each
循环来遍历所有的元素。Collection<V> values()
:返回 LinkedHashMap
中的值集合,可以使用 Iterator
或者 for-each
循环来遍历所有的元素。由于 LinkedHashMap
能够维护插入顺序,所以它常常被用在需要将数据按顺序排列的场合。借助于 LinkedHashMap
,我们可以很简单地实现 LRU
缓存算法,也可以实现数据库中的聚簇索引等。