当前位置:首页 > JavaScript

js实现hashmap

2026-02-01 18:19:09JavaScript

实现基础结构

使用对象或Map类作为基础存储结构。对象方式适合简单键值对,Map类支持更复杂的键类型(如对象、函数)。

// 对象实现
const hashMap = {};

// Map类实现
const map = new Map();

处理哈希冲突

采用链表法解决冲突,每个哈希桶存储一个链表。当多个键映射到同一索引时,将新元素添加到链表末尾。

class HashMap {
  constructor() {
    this.buckets = new Array(16).fill(null).map(() => []);
    this.loadFactor = 0.75;
  }

  _hash(key) {
    let hashCode = 0;
    for (let i = 0; i < key.length; i++) {
      hashCode = (hashCode << 5) - hashCode + key.charCodeAt(i);
    }
    return hashCode % this.buckets.length;
  }
}

实现核心方法

包含set、get、has、delete等基本操作,处理动态扩容逻辑。

set(key, value) {
  const index = this._hash(key);
  const bucket = this.buckets[index];
  const found = bucket.find(item => item.key === key);

  if (found) {
    found.value = value;
  } else {
    bucket.push({ key, value });
    this._resize();
  }
}

get(key) {
  const index = this._hash(key);
  const bucket = this.buckets[index];
  const found = bucket.find(item => item.key === key);
  return found ? found.value : undefined;
}

动态扩容机制

当元素数量超过容量阈值时自动扩容,通常扩大为当前容量的两倍。

js实现hashmap

_resize() {
  const occupied = this.buckets.filter(b => b.length > 0).length;
  if (occupied / this.buckets.length > this.loadFactor) {
    const oldBuckets = this.buckets;
    this.buckets = new Array(oldBuckets.length * 2).fill(null).map(() => []);
    oldBuckets.forEach(bucket => {
      bucket.forEach(item => {
        const newIndex = this._hash(item.key);
        this.buckets[newIndex].push(item);
      });
    });
  }
}

完整实现示例

class HashMap {
  constructor(initialCapacity = 16, loadFactor = 0.75) {
    this.buckets = new Array(initialCapacity).fill(null).map(() => []);
    this.loadFactor = loadFactor;
    this.size = 0;
  }

  _hash(key) {
    let hash = 0;
    const stringKey = String(key);
    for (let i = 0; i < stringKey.length; i++) {
      hash = (hash << 5) - hash + stringKey.charCodeAt(i);
    }
    return Math.abs(hash % this.buckets.length);
  }

  set(key, value) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    const existing = bucket.find(item => item.key === key);

    if (existing) {
      existing.value = value;
    } else {
      bucket.push({ key, value });
      this.size++;
      if (this.size / this.buckets.length > this.loadFactor) {
        this._resize();
      }
    }
    return this;
  }

  get(key) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    const found = bucket.find(item => item.key === key);
    return found ? found.value : undefined;
  }

  has(key) {
    return this.get(key) !== undefined;
  }

  delete(key) {
    const index = this._hash(key);
    const bucket = this.buckets[index];
    const itemIndex = bucket.findIndex(item => item.key === key);

    if (itemIndex >= 0) {
      bucket.splice(itemIndex, 1);
      this.size--;
      return true;
    }
    return false;
  }

  _resize() {
    const newCapacity = this.buckets.length * 2;
    const newBuckets = new Array(newCapacity).fill(null).map(() => []);

    this.buckets.forEach(bucket => {
      bucket.forEach(item => {
        const newIndex = this._hash(item.key);
        newBuckets[newIndex].push(item);
      });
    });

    this.buckets = newBuckets;
  }
}

标签: jshashmap
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…