Java哈希映射内部工作123



我想知道如何在哈希图中检索特定bucket的链表。

我们知道密钥存储在存储桶中,如果密钥发生冲突,每个存储桶都有一个链表。所以,如果哈希映射正在维护链表,而不是删除或覆盖值,那么我们如何检索链表呢?

那么我们如何检索链接列表呢?

恐怕你不能。原因有很多。例如:

  1. 这是一个隐藏的实现细节,因为它可能会在没有通知的情况下更改。

  2. 在最近的实现中(Java 8以后(,它实际上不是一个链表。。。这强化了第一点的信息。是的,他们确实更改了它。

  3. 如果您能够直接访问数据结构,那么由于通过HashMapAPI中的正常操作对结构进行的意外更改,您的代码可能会以"有趣的方式"中断

  4. 您的代码还可以以"有趣的方式"破坏数据结构。


现在,如果你有点疯狂,你可以忽略上面的基本原理,使用反射来打破抽象并访问数据结构。但请不要在任何与我有任何关系的项目中尝试这个!

实际上,不能假设HashMap使用链表。OpenJDK8的HashMap是链表和树的混合体。

它是一个私有变量,因此需要使用反射并依赖于内部细节。但一旦走上这条路,就会创建对特定JDK版本的依赖关系。例如,如果您实现代码来遍历JDK8 HashMap,那么它可能会对JDK9树等变得毫无用处,更不用说其他JDK实现了。(编辑:看来反射可能不适用于Java 9。(

如果您想依赖某些特定的HashMap实现,那么您还应该自己实现它(或者复制OpenJDK(。

最新更新