当前位置:首页 > JavaScript

js实现hashtable

2026-03-15 03:37:32JavaScript

JavaScript 实现哈希表的方法

使用对象(Object)实现哈希表

JavaScript 的对象({})本质上是一个键值对集合,可以直接用作哈希表。键必须是字符串或 Symbol 类型。

js实现hashtable

const hashTable = {};

// 添加键值对
hashTable["key1"] = "value1";
hashTable["key2"] = "value2";

// 获取值
console.log(hashTable["key1"]); // 输出: "value1"

// 删除键值对
delete hashTable["key1"];

使用 Map 实现哈希表

ES6 引入的 Map 对象更适合作为哈希表,因为它支持任意类型的键(包括对象),并且保留了插入顺序。

js实现hashtable

const hashMap = new Map();

// 添加键值对
hashMap.set("key1", "value1");
hashMap.set("key2", "value2");

// 获取值
console.log(hashMap.get("key1")); // 输出: "value1"

// 删除键值对
hashMap.delete("key1");

// 检查键是否存在
console.log(hashMap.has("key2")); // 输出: true

自定义哈希表实现

如果需要完全控制哈希表的行为(如哈希函数、冲突处理等),可以手动实现一个哈希表类。

class HashTable {
  constructor(size = 32) {
    this.size = size;
    this.buckets = new Array(size).fill(null).map(() => []);
  }

  // 哈希函数
  hash(key) {
    let hashValue = 0;
    for (let i = 0; i < key.length; i++) {
      hashValue += key.charCodeAt(i);
    }
    return hashValue % this.size;
  }

  // 添加键值对
  set(key, value) {
    const index = this.hash(key);
    const bucket = this.buckets[index];
    const existingEntry = bucket.find(entry => entry.key === key);

    if (existingEntry) {
      existingEntry.value = value;
    } else {
      bucket.push({ key, value });
    }
  }

  // 获取值
  get(key) {
    const index = this.hash(key);
    const bucket = this.buckets[index];
    const entry = bucket.find(entry => entry.key === key);
    return entry ? entry.value : undefined;
  }

  // 删除键值对
  delete(key) {
    const index = this.hash(key);
    const bucket = this.buckets[index];
    const entryIndex = bucket.findIndex(entry => entry.key === key);

    if (entryIndex !== -1) {
      bucket.splice(entryIndex, 1);
      return true;
    }
    return false;
  }
}

// 使用示例
const table = new HashTable();
table.set("name", "Alice");
console.log(table.get("name")); // 输出: "Alice"
table.delete("name");

哈希冲突处理

哈希冲突是多个键映射到同一个桶的情况。常见的冲突处理方法包括链地址法(如上述自定义实现)和开放寻址法。

性能优化

  • 动态扩容:当哈希表的负载因子(元素数量 / 桶数量)超过阈值时,可以扩容以减少冲突。
  • 更好的哈希函数:减少冲突的概率,如使用加密哈希函数(如 SHA-1,但性能较低)或更均匀的分布函数。

注意事项

  • 对象({})的键只能是字符串或 Symbol,而 Map 支持任意类型。
  • 自定义哈希表需要处理哈希冲突和性能问题。
  • Map 是标准化的哈希表实现,推荐优先使用。

标签: jshashtable
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…