Javascript中哈希表的实现

一、什么是哈希表?

哈希表是一种数据结构,可以快速存储和查找键值对(Key-Value Pairs)。它的核心思想是:

  1. 通过哈希函数:将一个键(Key)转换成唯一的数字(哈希值)。
  2. 用这个数字作为索引,直接找到对应的值(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 内部实现)。
    • 开放寻址法:寻找下一个空槽位。

四、哈希表的应用场景

  1. 快速去重 (用 Set):

    javascript 复制代码
    const arr = [1, 2, 2, 3];
    const unique = [...new Set(arr)]; // [1, 2, 3]
  2. 缓存数据 (用 MapObject):

    javascript 复制代码
    const cache = new Map();
    function getUser(id) {
      if (cache.has(id)) return cache.get(id);
      const user = fetchUserFromDatabase(id); // 假设这是耗时操作
      cache.set(id, user);
      return user;
    }
  3. 统计频率 (用 Object):

    javascript 复制代码
    const str = "hello";
    const count = {};
    for (const char of str) {
      count[char] = (count[char] || 0) + 1;
    }
    // { h:1, e:1, l:2, o:1 }

六、总结

  • 哈希表 的核心是"快速定位数据"。
  • JavaScript 实现 :优先用 MapSet(功能更强大),普通对象适合简单场景。
  • 注意 :哈希函数的设计会影响性能,但 JavaScript 内置的 MapSet 已经帮我们处理好了底层细节。

常见用法:

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>
相关推荐
「PlanA」9 小时前
测试开发面经001
面试
不可求~10 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
数模竞赛Paid answer10 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆10 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
JL1510 小时前
面试项目被问到自闭-如何把课设包装成亮眼项目
面试·职场和发展
想吃火锅100511 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
Nil20812 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
AC赳赳老秦13 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
谢慧琼13 小时前
2026零基础做企业网站,低成本搭建官方网站
服务器·前端·javascript
依然鸣13 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论