数据结构之HashMap
HashMap的结构,是数组+链表+红黑树的结构。当链表长度大于8时,转为红黑树结构。HashMap是线程不安全的。
模拟实现一个HashMap
在我面试微软时,有一道题目是用JavaScript模拟实现一个HashMap。当时不了解HashMap是什么。 所以现在重新模拟实现HashMap,没有红黑树的结构,也没有线程安全的保证。存粹是为了学习。
// 链表的节点 class Node { constructor(key, value, next = null) { this.key = key; this.value = value; this.next = next; } } // HashMap class HashMap { constructor(size = 16) { this.size = 0; this.table = []; for (let i = 0; i < size; i++) { this.table[i] = [null, 0]; } } hashConversion(key) { let keyCode = 0; for(const item of key) { keyCode += item.charCodeAt(0) } return keyCode % this.table.length; } set(key, value) { const index = this.hashConversion(key); const indexValue = this.table[index][0]; if (indexValue === null) { this.table[index][0] = new Node(key, value); this.table[index][1] += 1; this.size += 1; return; } let currentBefore = null; let current = indexValue; while (current) { if (current.key === key) { current.value = value; break; } else { currentBefore = current; current = current.next; } } if (current === null) { currentBefore.next = new Node(key, value); this.table[index][1] += 1; this.size += 1; } } get(key) { let result = null; const index = this.hashConversion(key); const indexValue = this.table[index][0]; if (indexValue === null) { return result; } let current = indexValue; while (current) { if (current.key === key) { result = current.value; break; } } return result; } remove(key) { const index = this.hashConversion(key); const indexValue = this.table[index][0]; if (indexValue === null) { return; } let currentBefore = null; let current = indexValue; while (current) { if (current.key === key) { if (currentBefore === null) { this.table[index][0] = current.next; } else { currentBefore.next = current.next; } this.table[index][1] -= 1; this.size -= 1; break; } else { currentBefore = current; current = current.next; } } } }