“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 HashMap
,Entry
类只有一个对密钥的引用(在恰当的名称key
字段中),因此密钥只存储一次。
【讨论】:
“取决于你使用的 JVM”取决于 Java 运行时库的实现,而不是 JVM 本身。 @Raedwald: true,但通常 JVM 绑定到运行时库实现。【参考方案2】:没有。为了选择正确的存储桶,对键进行哈希处理,然后将其用作索引。无需在此处存储任何内容。
【讨论】:
【参考方案3】:我不确定,但似乎没有必要这样做。当访问 HashMap 中的存储桶时,哈希函数将应用于正在搜索的键。然后它可以将此密钥与存储的密钥进行比较。
【讨论】:
【参考方案4】:没有。如果您想确切了解HashMap
的工作原理,可以查找源代码。在你的JDK安装目录下应该有一个名为src.zip
的文件,其中包含标准库中所有类和接口的Java源代码。
【讨论】:
以上是关于“key”是不是在 Java HashMap 中存储了两次?的主要内容,如果未能解决你的问题,请参考以下文章