【问题标题】:Hash table and Hash map in javascriptjavascript中的哈希表和哈希映射
【发布时间】:2016-08-04 12:44:42
【问题描述】:

hashtable && hashmap 的内部表示是,

在Java中,hashtablehashmap在同步/异步操作上是有区别的,否则内部表示是一样的。

Javascript 对象字面量表示法,

var obj = {
           e1: 1,
           e2: 2,
           e3: 3  
         };

可以直接作为hashtable和hashmap使用,自带hash函数。对象文字有字符串或符号作为键。

ES6 还引入了window.Map,可以任意值作为键。

1) 上面的 hashtable 和 hashmap 的内部表示看起来正确吗? (或)hashtable和hashmap的内部表示有区别吗?

2) Javascript 对象字面量是否为 hashtable/hashmap 提供 O(1) 计算而没有任何冲突?

【问题讨论】:

标签: javascript java hash hashmap hashtable


【解决方案1】:

您的图片是实现hash table data structure一种方式 - 还有其他方式。您的图像是“分离链接”的示例,“开放寻址”是另一种常见的策略。从 Java 7 开始,HashtableHashMap 都使用了一种链接形式(查看它们的 Entry 类),但是 Java 8 引入了对 HashMap 的大规模重写(但不是 Hashtable,因为它是一个遗留类) 为其链使用树结构而不是链表。关键是两个类使用的确切算法是一个实现细节,可能会在不同版本之间发生变化。

“HashMap”和“Hashtable”只是JDK定义的类名,不一定对应特定的哈希算法。 JavaScript 没有单独的“HashMap”和“Hashtable”概念,因为它们不需要它们。 Java 需要创建一个单独的 HashMap 类,因为 Hashtable 契约存在问题并且无法安全地纠正。

所以,回答你的问题:

1) 排序;它不能正确地代表 Java 8 的HashMap,但从概念上来说并不遥远。 Hashtable 仍然使用此算法,但您几乎不应该使用 Hashtable

2) 就像你说的,JavaScript 对象在底层使用哈希表数据结构。这确实(通常)提供了 O(1) 字段访问,但与任何哈希表实现一样,它必须处理冲突的可能性。正如在链接到exact implementation is browser-dependent 的问题@overexchange 中所讨论的那样。

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多