一、什么是哈希表?
哈希表是一种数据结构,可以快速存储和查找键值对(Key-Value Pairs)。它的核心思想是:
- 通过哈希函数:将一个键(Key)转换成唯一的数字(哈希值)。
- 用这个数字作为索引,直接找到对应的值(Value)。
举个栗子🌰:
- 假设你有一个电话簿,名字是"键",电话号码是"值"。
- 哈希表就像直接通过名字的拼音首字母(哈希函数)快速找到对应的电话号码。
二、JavaScript 中的哈希表实现
JavaScript 没有直接的"哈希表"类型,但可以通过以下三种方式实现类似功能:
1. 普通对象(Object)
javascript
const phoneBook = {};
phoneBook["Alice"] = "123-456"; // 添加键值对
console.log(phoneBook["Alice"]); // 输出 "123-456"(查找)
- 缺点:键只能是字符串或 Symbol,无法用对象作为键。
2. Map(ES6 新增)
javascript
const map = new Map();
map.set("Alice", "123-456"); // 添加键值对
console.log(map.get("Alice")); // 输出 "123-456"(查找)
- 优点 :
- 键可以是任意类型(对象、函数等)。
- 保持插入顺序(普通对象不保证顺序)。
- 有
size
属性直接获取长度。
3. Set(ES6 新增)
javascript
const set = new Set();
set.add(1); // 添加值
console.log(set.has(1)); // 输出 true(检查存在性)
- 用途:仅存储唯一的值(自动去重),没有键值对。
三、哈希表的特性
1. 时间复杂度
- 插入、删除、查找:平均时间复杂度是 O(1)(非常高效!)。
- 为什么快?哈希函数直接将键映射到内存位置,不需要遍历所有元素。
2. 哈希冲突
- 问题:不同的键可能生成相同的哈希值(比如 "Alice" 和 "Bob" 哈希后都是 5)。
- 解决方式 :
- 链地址法:同一个索引位置存储一个链表(如 JavaScript 的 Map 内部实现)。
- 开放寻址法:寻找下一个空槽位。
四、哈希表的应用场景
-
快速去重 (用
Set
):javascriptconst arr = [1, 2, 2, 3]; const unique = [...new Set(arr)]; // [1, 2, 3]
-
缓存数据 (用
Map
或Object
):javascriptconst cache = new Map(); function getUser(id) { if (cache.has(id)) return cache.get(id); const user = fetchUserFromDatabase(id); // 假设这是耗时操作 cache.set(id, user); return user; }
-
统计频率 (用
Object
):javascriptconst str = "hello"; const count = {}; for (const char of str) { count[char] = (count[char] || 0) + 1; } // { h:1, e:1, l:2, o:1 }
六、总结
- 哈希表 的核心是"快速定位数据"。
- JavaScript 实现 :优先用
Map
和Set
(功能更强大),普通对象适合简单场景。 - 注意 :哈希函数的设计会影响性能,但 JavaScript 内置的
Map
和Set
已经帮我们处理好了底层细节。
常见用法:
xml
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//js中一共有三种方式实现哈希表
//1.普通对象
const hash1 = {};
//添加:键值对,左边是键,右边是值.
hash1["苗"]=18;
// 获取:值
console.log(hash1["苗"]);
//2.Map法es6中新增
const hash2 = new Map();
//添加
hash2.set("余",17);
//获取
console.log(hash2.get("余"));
//长度
console.log(hash2.size);
//3.Set法es6中新增,仅存储唯一值,没有键值对
const hash3 = new Set();
//添加
hash3.add(1);
//获取,返回值是布尔类型
console.log(hash3.has(1));
</script>
</body>
</html>