“key”是不是在 Java HashMap 中存储了两次?

Posted

技术标签:

【中文标题】“key”是不是在 Java HashMap 中存储了两次?【英文标题】:Is "key" stored twice in Java HashMap?“key”是否在 Java HashMap 中存储了两次? 【发布时间】:2011-10-30 15:38:01 【问题描述】:

当一个键值对被添加到 Java 中的 HashMap 时,为了确定值对象的存储桶位置,哈希映射实现使用“键”对象的 hashCode 并对其进行哈希处理。最后将键值对存储在桶中。存储关键对象,以便在发生冲突时可以正确检索对象。

我的问题是,“键”对象是否在 HashMap 中存储了两次,一次作为键,然后存储在存储桶中,其中键值对存储在链表中?

【问题讨论】:

除了桶,没有其他地方可以存放。因此,密钥只存储一次,即存储在桶内。 【参考方案1】:

没有。

首先:HashMap 和(实际上是其他任何东西)只能存储您传递给它的某个对象的引用。因此,即使如果要存储对键的两个引用,其内存需求也将是最小的。

下一步:HashMap 的实际实现不是 Java 标准规定的,因此它可能(并且将会)根据您使用的 哪个 JVM 有所不同。

最后,查看at the OpenJDK source code of HashMapEntry 类只有一个对密钥的引用(在恰当的名称key 字段中),因此密钥只存储一次。

【讨论】:

“取决于你使用的 JVM”取决于 Java 运行时库的实现,而不是 JVM 本身。 @Raedwald: true,但通常 JVM 绑定到运行时库实现。【参考方案2】:

没有。为了选择正确的存储桶,对键进行哈希处理,然后将其用作索引。无需在此处存储任何内容。

【讨论】:

【参考方案3】:

我不确定,但似乎没有必要这样做。当访问 HashMap 中的存储桶时,哈希函数将应用于正在搜索的键。然后它可以将此密钥与存储的密钥进行比较。

【讨论】:

【参考方案4】:

没有。如果您想确切了解HashMap 的工作原理,可以查找源代码。在你的JDK安装目录下应该有一个名为src.zip的文件,其中包含标准库中所有类和接口的Java源代码。

【讨论】:

以上是关于“key”是不是在 Java HashMap 中存储了两次?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的HashMap

JAVA HashMap详细介绍和示例

java把数据以key-value形式放到内存中,以后匹配key值就可以读取数据。大概想法有,求详细代码!!

java源码分析之集合框架HashMap 10

java集合hashmap的使用

Java高级