【问题标题】:Arrays of Hash Table storing two types of references存储两种类型引用的哈希表数组
【发布时间】:2017-07-20 08:48:26
【问题描述】:

我的问题是关于哈希表的桶数组(例如,称为 A)。由于有时在哈希映射中会发生冲突,因此通常使用简单的链接解决方案。也就是说,让每个桶指向一个包含条目的链表,如果发生冲突,只需将具有相同键的新条目添加到这个列表中。

但是根据数据结构书,当一个桶A[i]为空时,它存储null,如果A[i]只存储一个条目(键,值),我们可以简单地有A[i]点直接指向条目(键,值),而不是指向仅包含一个条目的基于列表的映射。因此,我认为哈希表将包含两种不同类型的对象(条目对象和列表对象)。

我在实现这个方法时遇到了麻烦。我选择声明一个新的抽象类(例如称为“super”),它由 List 类和 Entry 类继承。而这个新类中没有任何内容。结果,哈希表现在只包含一种类型 Object “super”,它可以指向我需要的两种类型的对象。但是,我必须使用“instanceof”来知道桶 A[i] 到底指向什么,以便执行添加新条目等操作。我听说过多使用 instanceof 是不合适的。而且会有很多地方需要“演员”。那么我应该将Entry和List类中的代码复制到“super”类中,以免使用这么多“cast”吗?

【问题讨论】:

  • HashtableHashMap 都将单个条目存储在其存储桶中。这些条目本身可以引用该桶中的下一个条目,从而最终形成一个链表。存储单个条目和条目列表之间没有区别,因为单个条目案例只是大小为 1 的列表。
  • 你可以只使用链接,即使是单个条目。
  • 顺便说一句,我无法理解您的最后一段。你在重新实现哈希表吗?如果是这样,为什么?您能否提供一些代码示例以更清楚地说明您的意思?
  • @Thomas 感谢您的回复。我认为在某种意义上我确实在重新实现哈希表 == 这是教科书中的一个练习,所以我自己编写。我认为桶需要指向一个正式的 List Object ,它有很多实例方法,如 insertFront()、insertBack() 等。现在我明白这里使用的 List 类应该与 Entry 类几乎相同。非常感谢!

标签: java arrays hashtable superclass


【解决方案1】:

将单个条目存储为只有一个链接的链表并没有错。毕竟,条目(仅包含键和值)与包含条目(包含键、值和对下一个链接的引用)的链表的链接之间的区别是单个引用下一个链接。这就是 HashMap 的 JDK 实现对具有少量条目的存储桶所做的。

这样您就不必担心在表中存储不同类型的对象。

另一方面,Java 8 中HashMap 的实现使用两个条目实现来存储桶的条目——Node(链表)和TreeNode(树的节点)。如果您查看实现,您会看到他们使用e instanceof TreeNode 来检查给定节点的特定类型。如您所见,即使是 JDK use "instanceof" to know what exactly the bucket A[i] is pointing to

【讨论】:

  • 非常感谢!现在我明白了这个问题。现在必须更改我的代码很多?
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 2015-08-14
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 2018-09-04
  • 2011-10-14
相关资源
最近更新 更多