📅  最后修改于: 2023-12-03 14:53:36.815000             🧑  作者: Mango
LinkedHashMap 是 Java API 中的一个 Map 接口的实现,它继承自 HashMap,除了继承 HashMap 的功能外,LinkedHashMap 还维护着一个双向链表,该链表按照插入的顺序管理元素。具体来说,LinkedHashMap 以哈希表的形式持有所有元素,同时每个元素还有两个指针,指向其前驱和后继元素,这样就能够以添加元素的顺序遍历哈希表中的所有元素。
本文将介绍如何使用 Java 语言来实现 LinkedHashMap API,包括如何定义该数据结构的数据域、构造函数、添加、删除、查找等基本操作。
LinkedHashMap 数据结构包含以下数据域:
private final Map<K, V> map;
private final Deque<K> deque;
map
是哈希表,用于存储元素。deque
是双向链表,用于按照插入顺序维护元素的顺序。
LinkedHashMap 类含有两个构造函数,分别为无参和容量为 n 的构造函数。在构造函数中,需要创建一个新的哈希表和双向链表来存储元素。
/**
* 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空链接哈希映射。
*/
public LinkedHashMap() {
map = new HashMap<>();
deque = new LinkedList<>();
}
/**
* 构造一个具有指定初始容量 capacity 和默认加载因子 (0.75) 的空链接哈希映射。
*/
public LinkedHashMap(int capacity) {
map = new HashMap<>(capacity);
deque = new LinkedList<>();
}
往 LinkedHashMap 添加元素有两个步骤:
/**
* 在此映射中关联指定值与指定键。
*
* @param key the key with which the specified value is to be associated
* @param value the value to be associated with the specified key
* @return the previous value associated with key, or null if there was no mapping for key.
*/
public V put(K key, V value) {
V oldValue = map.get(key);
if (oldValue == null) {
deque.addLast(key);
} else {
deque.remove(key);
}
deque.addLast(key);
map.put(key, value);
return oldValue;
}
从 LinkedHashMap 中移除元素也需要两个步骤:
/**
* 从此映射中移除指定键的映射关系(如果存在)。
*
* @param key the key whose mapping is to be removed from the map
* @return the previous value associated with key, or null if there was no mapping for key.
*/
public V remove(Object key) {
V oldValue = map.remove(key);
deque.remove(key);
return oldValue;
}
获取 LinkedHashMap 中指定 key 对应的 value 也需要处理链表。
当哈希表中存在元素时,需要将该 key 对应的元素从链表的当前位置移到链表的末尾,以保证元素在哈希表迭代时按照插入的顺序返回。
/**
* 返回指定键所映射的值,如果此映射不包含该键的映射关系,则返回 null。
*
* @param key the key whose associated value is to be returned
* @return the value to which the specified key is mapped, or null if this map contains no mapping for the key
*/
public V get(Object key) {
V value = map.get(key);
if (value != null) {
deque.remove(key);
deque.addLast((K) key);
}
return value;
}
LinkedHashMap 是一个包含了哈希表和双向链表的数据结构,能够保证元素在哈希表迭代时按照插入的顺序返回。本文中介绍了如何使用 Java 语言来实现 LinkedHashMap API,包括数据结构的数据域、构造函数、添加、删除、查找等基本操作。如果你想要更深入地了解 LinkedHashMap 的实现细节,可以参考 Java API 的源代码。