目录
基本概念
哈希表常用操作
基本实现
哈希冲突与扩容
哈希冲突
扩容
哈希冲突
链式地址
开放地址
1. 线性探测
2. 平方探测
3. 多次哈希
注意
哈希算法
定义:
关键特性
常见的哈希算法
其他哈希算法
在Java中的实现
哈希表(hash table),又称散列表,它通过建立键key 与值value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键key ,则可以在(1) 时间内获取对应的值value 。
‧ 添加元素:仅需将元素添加至数组(链表)的尾部即可,使用(1) 时间。
‧ 查询元素:由于数组(链表)是乱序的,因此需要遍历其中的所有元素,使用() 时间。
‧ 删除元素:需要先查询到元素,再从数组(链表)中删除,使用() 时间。
数组 链表 哈希表
查找元素 () () (1)
添加元素 (1) (1) (1)
删除元素 () () (1)
观察发现,在哈希表中进行增删查改的时间复杂度都是(1) ,非常高效。
import java.util.HashMap;
import java.util.Map;
public class HashTableExample {
public static void main(String[] args) {
// 创建一个空的哈希表
HashMap hashTable = new HashMap<>();
// 插入键值对
hashTable.put("one", 1);
hashTable.put("two", 2);
hashTable.put("three", 3);
// 查找键值对
Integer value = hashTable.get("two");
System.out.println("Value for 'two': " + value);
// 更新键值对
hashTable.put("two", 22);
// 删除键值对
hashTable.remove("two");
// 清空哈希表
hashTable.clear();
// 检查是否包含键
boolean containsTwo = hashTable.containsKey("two");
System.out.println("Contains 'two': " + containsTwo);
// 获取键集合
Map map = new HashMap<>(hashTable);
System.out.println("Keys: " + map.keySet());
// 获取值集合
System.out.println("Values: " + map.values());
// 获取哈希表大小
int size = hashTable.size();
System.out.println("Size of the hash table: " + size);
}
}
输出结果
Value for 'two': 2
Contains 'two': false
Keys: []
Values: []
Size of the hash table: 0
说明
HashMaphashTable = new HashMap<>(); 创建了一个新的空哈希表。
hashTable.put("key", value) 用于插入键值对。
hashTable.get("key") 用于获取键对应的值,如果键不存在则返回 null。
hashTable.remove("key") 用于删除键值对。
hashTable.clear() 清空哈希表。
hashTable.containsKey("key") 检查键是否存在。
hashTable.keySet() 和 hashTable.values() 分别返回键和值的集合。
hashTable.size() 返回哈希表中键值对的数量。