首页 > 解决方案 > HashMap中key-pair的值修改及对HashCode的影响

问题描述

几天前,我接受了一次采访,出现了一些有趣的问题。也就是说,招聘人员问了我一些细致的问题。其中一些是基于上述机制的HashCode与集合之间的密切关系。

第一个问题或多或少像:hashCode 的质量对 hashMap 的工作有什么影响?这个问题不是字面上的措辞,但我认为这个问题是关于性能的。

第二个问题涉及修改 hashMap 对的一个值的问题,以及此操作对性能的潜在影响以及此类过程可能出现的问题。没有明确说明如何修改值,但我认为这是一个 put() 方法。例如,我们在 hashMap 中有一对像 ["Programming", 7]。如果我们修改值 7 或“编程”会发生什么。

第三个问题是开放式的,听起来像这样:如何为没有任何字段的对象计算 hashCode 值。

对于第二个问题,我问的是:

we are not able to modify key of the pair because in the hashmap internal implementation key modifier is marked as final

如果我们想这样做,我们应该删除这个特定的对并添加所需的值。

我问过在 hashMap 中修改对(键值)的值对 HashCode 没有影响,因为我们应该基于 String 这样的不可变键进行计算,但我无法意识到这对招聘人员来说是否足够,因为事实上,这次采访不是面对面的。

老实说,这次面试有点困惑,因为招聘人员太神秘了,这就是为什么我想知道从你的角度来看,你是否可以看到这三个问题的另一个底部,我可以在我的回复中添加一些额外的信息。

如果您能提出这些神秘问题背后的原因,我将不胜感激。

标签: javahashmaphashcodehash-collision

解决方案


以下是假设我正确理解了这些问题:

对问题 1 的回答:值的修改是否对 HashMap 键值的存储方式没有任何影响,但是如果键和值不是不可变的,那么更改也会反映在 HashMap 对象中。如果你在外面修改key,你可能无法从HashMap中找到对象,这就是为什么Keys应该是不可变的原因。

对问题 2 的回答: 如果您不在类中覆盖 hashCode,则 JDK 提供的默认 hashCode 实现基于将传递的内存位置,因此无论对象是否为空。如果您覆盖 hashCode 那么无论您的 hashCode 函数做什么,结果都会是您所写的。


推荐阅读