哈希表是一种存储键值对的数据结构,它通过把键映射到表中一个位置来进行快速检索。
我们可以使用链地址法实现一个哈希表:
public class HashTable {
private int capacity; // 哈希表容量
private LinkedList<Node>[] table; // 哈希表数组
public HashTable(int capacity) {
this.capacity = capacity;
table = new LinkedList[capacity];
}
public void put(int key, int val) {
int hash = key % capacity; // 哈希函数
if (table[hash] == null) table[hash] = new LinkedList<>(); // 链表为空则初始化
Node node = search(key); // 查找键是否已经存在
if (node != null) node.val = val; // 如果存在则更新值
else table[hash].add(new Node(key, val)); // 若不存在则新增节点
}
public int get(int key) {
int hash = key % capacity;
if (table[hash] != null) {
Node node = search(key);
if (node != null) return node.val;
}
return -1; // 如果不存在则返回-1
}
private Node search(int key) {
int hash = key % capacity;
if (table[hash] != null) {
for (Node node : table[hash]) {
if (node.key == key) return node; // 遍历链表查找键
}
}
return null; // 如果不存在则返回null
}
}
所以,哈希表的实现步骤为:
- 确定哈希表的容量 capacity,默认为素数。
- 使用链地址法,将键值对存储在链表数组 table 中。
- 定义一个简单的哈希函数,比如取余法。
- put 操作:先计算键的哈希值,如果对应链表为空则初始化。如果键已存在则更新值,否则新增节点。
- get 操作:先计算键的哈希值,然后在对应链表中查找键。如果找到则返回值,否则返回 -1。
- search 方法用于在链表中查找键,找到则返回节点,否则返回 null。
- 链表在第一个节点插入时初始化,避免每次插入前都判断是否为空。