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