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

Arrays of Hash Table storing two types of references

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

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

我在实现这个 method.I 选择声明一个新的抽象 class(例如称为 "super" )时遇到了麻烦,它由列表 class 和条目继承class.And 这个新 class 中没有任何内容。结果,散列 table 现在只包含一种类型的对象 "super",它可以指向我需要的两种类型的对象。但是,我必须使用 "instanceof" 才能知道存储桶 A[i] 究竟指向什么,以便执行添加新条目等操作。我听说过度使用 instanceof 是不合适的。而且会有很多地方需要"cast"。那么我应该将 class 条目和列表中的代码复制到 "super" class 中以便不使用那么多 "cast" 吗?

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

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

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