哈希表(HashMap)简介
哈希表的实质是一种结合数组和链表优势的复合数据结构,类似于 Java 官方提供的 HashMap 集合类。它基于哈希函数 + 链表解决冲突的思想手动实现底层存储结构。其本质是'数组 + 链表'的组合存储逻辑,需要通过定义哈希函数、链表节点、核心操作方法来赋予其可操作的能力。
哈希表以数组为底层基础容器,通过哈希函数将键(Key)映射到数组的指定索引位置;当多个键映射到同一索引时(哈希冲突),则通过链表将这些冲突的键值对串联存储,既保留了数组随机访问的高效性,又解决了数组固定长度及冲突存储的问题。
自定义 HashMap 实现步骤
1. 定义核心组件
(1)节点类(Node)
节点类是哈希表中存储键值对的最小单位,需要定义存储键、值的属性,以及指向下一个节点的引用(用于链表串联)。
- 属性:键 key、值 value、下一个节点 next。
- 构造方法:用于初始化节点的键和值,给 next 引用赋默认值 null。
class Node {
Object key;
Object value;
Node next;
// 构造方法:初始化键值对,next 默认 null
public Node(Object key, Object value) {
this.key = key;
this.value = value;
this.next = null;
}
}
(2)链表类(LinkList)
链表类用于解决哈希冲突,存储数组同一索引下的所有冲突键值对,需要定义链表的头节点属性,以及添加、查询键值对的方法。
- 属性:头节点 head,作为链表遍历的起点。
- 方法:添加/覆盖键值对、根据键查询值。
class LinkList {
// 链表头节点
private Node head;
// 添加/覆盖键值对:存在相同 key 则覆盖 value,不存在则新增节点
public void add(Object key, Object value) {
// 头节点为空,直接创建新节点作为头节点
if (head == null) {
head = new Node(key, value);
return;
}
// 遍历链表,查找是否存在相同 key
Node head;
(current != ) {
(equals(key, current.key)) {
current.value = value;
;
}
(current.next == ) {
;
}
current = current.next;
}
current.next = (key, value);
}
Object {
head;
(current != ) {
(equals(key, current.key)) {
current.value;
}
current = current.next;
}
;
}
{
(k1 == && k2 == ) {
;
}
(k1 == || k2 == ) {
;
}
k1.equals(k2);
}
}


