Java HashMap中密钥对的值修改和对HashCode的影响

Java HashMap中密钥对的值修改和对HashCode的影响,java,hashmap,hashcode,hash-collision,Java,Hashmap,Hashcode,Hash Collision,几天前,我接受了一次采访,出现了一些有趣的问题。也就是说,招聘人员问了我一些细致的问题。其中一些涉及HashCode和集合之间的密切关系,这些集合基于上述机制 第一个问题或多或少是这样的:hashCode的质量对hashMap的工作有什么影响?这个问题不是字面上说的,但我认为这个问题是关于性能的 第二个问题涉及修改hashMap对的一个值的问题,以及此操作对性能的潜在影响以及此过程可能产生的问题。没有明确说明如何修改该值,但我认为这是一个put()方法。例如,我们在hashMap中有一对类似[“

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

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

第二个问题涉及修改hashMap对的一个值的问题,以及此操作对性能的潜在影响以及此过程可能产生的问题。没有明确说明如何修改该值,但我认为这是一个put()方法。例如,我们在hashMap中有一对类似[“编程”,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没有影响,因为我们应该根据字符串等不变键进行计算,但我无法意识到这对招聘人员来说是否足够,因为这次面试不是面对面的

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

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


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

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

关于修改问题-假设我们有一个哈希代码为
5
的对象。 我们使用它作为
HashMap
中的一个键来存储一些值。
HashMap
将此密钥存储在
5
的存储桶中

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

但是,如果我们删除密钥,修改它,然后将其与原始值一起放回原处,那么一切都是它应该位于的位置

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


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

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

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

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

老实说,您的问题非常令人困惑。不要只向我们扔一个大的文本块。找出你的核心问题,理想情况下,写一段代码来解释,“我们在HashMap中修改了一个特定对的值”与HashMap无关。只考虑了密钥。请参阅,也许,了解他所说的哈希代码不一致性的含义。毕竟,hashCode通常与HashMap的值无关。我也很困惑。整个采访和问题都是谜一般的,比如,当我问,我们是如何修改价值观的,他说的是,只要修改它就行了。“我想他在考虑put()方法,但我甚至不确定。”GhostCat问题澄清补充道。我希望现在比以前更清楚了。谢谢你的承诺。