哈希图中键对的值修改和对哈希代码的影响



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

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

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

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

对于第二个问题,我问:

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这样的不可变键进行计算,但我无法意识到这对招聘人员来说是否足够,因为这次面试不是面对面的。

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

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

面试官问为什么HashCode质量在HashMap中有一个对象的情况下如此重要,并且出于某种原因,我们修改了HashMap中一个特定对的值。

哈希代码质量对于在HashMap中正确分配密钥非常重要。想象一下,如果所有键都有相同的代码 - 我们需要线性数量的操作来找到键。

关于修改问题 - 假设我们有一个带有哈希代码的对象5. 我们将其用作HashMap中的密钥来存储一些价值。HashMap宫 这是5桶里的钥匙。

然后我们修改密钥而不删除它,因此它的哈希代码现在10.我们得到了什么?存储桶中10哈希代码的键,用于哈希代码5。这很糟糕,因为现在我们将无法在HashMap中找到它.

但是,如果我们删除密钥,对其进行修改,然后才将其放回原始值,那么一切都在应有的位置。

我们如何计算完全空的对象(没有任何字段(的哈希代码

只需使用该对象的默认Object.hashCode()实现即可。不要覆盖hashCode()

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

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

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

最新更新