哈希表的数组存储两种类型的引用

时间:2017-07-20 08:48:26

标签: java arrays hashtable superclass

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

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

我在实现这个方法时遇到了麻烦。我选择声明一个新的抽象类(Called" super"例如),它由List类和Entry类继承。这个新的东西没什么类。因此,哈希表现在只包含一种类型的对象" super"它可以指向我需要的两种类型的对象。但是,我必须使用" instanceof"知道存储桶A[i]到底指向的是什么,以便执行添加新条目等操作。我听说使用instanceof太多是不合适的。并且会有很多地方需要一个"演员"。因此,我应该将类Entry和List中的代码复制到" super"为了不使用那么多的"演员" s?

1 个答案:

答案 0 :(得分:1)

将单个条目存储为仅具有单个链接的链接列表没有任何问题。毕竟,条目(仅包含键和值)与包含条目的链接列表的链接(包含键,值和对下一个链接的引用)之间的区别是单个引用下一个链接。这就是HashMap的JDK实现对具有少量条目的桶的作用。

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

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