我的问题是关于哈希表的桶数组(例如,称为A)。由于哈希映射中有时会发生冲突,因此使用简单链接解决方案很常见。也就是说,使每个桶指向包含条目的链表,如果发生冲突,只需将具有相同键的新条目添加到该列表中。
但是根据数据结构书,当存储桶A[i]
为空时,它存储null
,如果A[i]
只存储一个条目(键,值),我们可以只需将A[i]
直接指向条目(键,值),而不是指向仅包含一个条目的基于列表的地图。因此,我认为哈希表将包含两种不同的对象(条目对象和列表对象)。
我在实现这个方法时遇到了麻烦。我选择声明一个新的抽象类(Called" super"例如),它由List类和Entry类继承。这个新的东西没什么类。因此,哈希表现在只包含一种类型的对象" super"它可以指向我需要的两种类型的对象。但是,我必须使用" instanceof"知道存储桶A[i]
到底指向的是什么,以便执行添加新条目等操作。我听说使用instanceof太多是不合适的。并且会有很多地方需要一个"演员"。因此,我应该将类Entry和List中的代码复制到" super"为了不使用那么多的"演员" s?
答案 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
。