Java Hashmap内部工作原理123

时间:2018-10-30 09:51:14

标签: java android

我想知道如何在哈希图中检索特定存储桶的链接列表。

我们知道密钥存储在存储桶中,如果发生密钥冲突,则每个存储桶都有一个链接列表。因此,如果Hash映射正在维护链表而不删除或覆盖值,那么我们如何检索该链表?

2 个答案:

答案 0 :(得分:1)

  

那么我们如何检索该链表?

恐怕你做不到。并出于多种原因。例如:

  1. 这是一个隐藏的实现细节,因为如有更改,恕不另行通知。

  2. 在最近的实现中(从Java 8开始),它实际上不是链接列表...可以增强第一点的信息。是的,他们没有对其进行了更改。

  3. 如果您能够直接访问数据结构,则由于通过HashMap API中通过常规操作对结构进行的意外更改,代码可能会以“有趣的方式”中断。 `

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


现在,如果您有点发疯,则可以忽略上述原理,而使用反射来破坏抽象并访问数据结构。但是请不要在与我有任何关系的任何项目中尝试此操作!

答案 1 :(得分:0)

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

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

如果您要依赖某些特定的HashMap实现,则还应该自己实现(或复制OpenJDK)。