📜  实现 LinkedHashMap API 的Java程序(1)

📅  最后修改于: 2023-12-03 14:53:36.815000             🧑  作者: Mango

实现 LinkedHashMap API 的Java程序

简介

LinkedHashMap 是 Java API 中的一个 Map 接口的实现,它继承自 HashMap,除了继承 HashMap 的功能外,LinkedHashMap 还维护着一个双向链表,该链表按照插入的顺序管理元素。具体来说,LinkedHashMap 以哈希表的形式持有所有元素,同时每个元素还有两个指针,指向其前驱和后继元素,这样就能够以添加元素的顺序遍历哈希表中的所有元素。

本文将介绍如何使用 Java 语言来实现 LinkedHashMap API,包括如何定义该数据结构的数据域、构造函数、添加、删除、查找等基本操作。

1.数据域

LinkedHashMap 数据结构包含以下数据域:

private final Map<K, V> map;
private final Deque<K> deque;

map 是哈希表,用于存储元素。deque 是双向链表,用于按照插入顺序维护元素的顺序。

2.构造函数

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<>();
}
3.put() 方法

往 LinkedHashMap 添加元素有两个步骤:

  1. 如果元素 key 已经存在于哈希表中,则更新元素的值并将其移动到链表的末尾,以保证元素在哈希表迭代时按照插入的顺序返回。
  2. 如果元素 key 不存在于哈希表中,则将元素添加到哈希表的末尾,并将其 key 添加到链表的末尾。
/**
* 在此映射中关联指定值与指定键。
*
* @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;
}
4.remove() 方法

从 LinkedHashMap 中移除元素也需要两个步骤:

  1. 从哈希表中移除元素。
  2. 从链表中移除元素的 key。
/**
* 从此映射中移除指定键的映射关系(如果存在)。
*
* @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;
}
5. get() 方法

获取 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;
}
6. 总结

LinkedHashMap 是一个包含了哈希表和双向链表的数据结构,能够保证元素在哈希表迭代时按照插入的顺序返回。本文中介绍了如何使用 Java 语言来实现 LinkedHashMap API,包括数据结构的数据域、构造函数、添加、删除、查找等基本操作。如果你想要更深入地了解 LinkedHashMap 的实现细节,可以参考 Java API 的源代码。