HashMap中key-pair的取值修改及对HashCode的影响
Value modification of key-pair in HashMap and impact for a HashCode
前几天去面试,问了几个很有意思的问题。即,招聘人员问了我细致的问题。其中一些关注HashCode与集合之间的密切关系,这些都是基于上述机制。
第一个问题差不多就是:hashCode的好坏对hashMap的工作有什么影响?这个问题不是字面上的措辞,但我认为这个问题是关于性能的。
第二个问题涉及修改hashMap对的一个或多个值的问题以及此操作对性能的潜在影响以及此类过程可能出现的问题。它没有明确说明如何修改值,但我认为这是一个 put() 方法。例如,我们在 hashMap 中有一对 ["Programming", 7]。如果我们修改值 7 或 "Programming".
会发生什么
第三个问题是开放的,听起来是这样的:没有任何字段的对象的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 这样的不可变键,但我无法意识到这是否足够对于招聘人员来说,由于这次面试不是面对面的。
老实说,这次面试有点混乱,因为招聘人员太神秘了,这就是为什么我想知道从你的角度来看,你是否能看到这三个问题的另一个底部,我可以添加一些额外的信息在我的回应中。
如果您能提出这些神秘问题背后的原因,我将不胜感激。
the interviewer asked why HashCode quality is so important in the situation when we have an object in HashMap and for some reason, we modified the value of one particular pair in HashMap.
哈希码质量对于在 HashMap
中正确分配密钥很重要。想象一下,如果所有的键都有相同的代码——我们需要线性数量的操作来找到一个键。
关于修改问题 - 假设我们有一个带有哈希码 5
的对象。
我们将它用作 HashMap
中的键来存储一些值。 HashMap
为 5
.
提供了存储桶中的密钥
然后我们修改密钥而不删除它,所以它的哈希码现在是 10
。我们得到什么?哈希码 5
的存储桶中具有哈希码 10
的密钥。这很糟糕,因为现在我们将无法在 HashMap
.
中找到它
然而,如果我们删除密钥,修改它,然后才将其恢复为原始值,那么一切都在它应该在的地方。
how we can calculate hashCode for the completely empty object(without any fields)
只需使用该对象的默认 Object.hashCode()
实现。不要覆盖 hashCode()
以下是在我正确理解问题的前提下:
问题 1 的答案: 是值的修改对 HashMap 键值的存储方式没有任何影响,但如果键和值不是不可变的,则更改也会反映在 HashMap 对象中。如果你在外面修改键,你可能无法从 HashMap 中找到对象,这就是为什么键应该是不可变的。
问题 2 的答案:
如果您不覆盖 class 中的 hashCode,则 JDK 提供的默认 hashCode 实现基于将传递的内存位置,因此无论对象是否为空。如果你覆盖 hashCode 那么无论你的 hashCode 函数做什么,结果都会是你写的。
前几天去面试,问了几个很有意思的问题。即,招聘人员问了我细致的问题。其中一些关注HashCode与集合之间的密切关系,这些都是基于上述机制。
第一个问题差不多就是:hashCode的好坏对hashMap的工作有什么影响?这个问题不是字面上的措辞,但我认为这个问题是关于性能的。
第二个问题涉及修改hashMap对的一个或多个值的问题以及此操作对性能的潜在影响以及此类过程可能出现的问题。它没有明确说明如何修改值,但我认为这是一个 put() 方法。例如,我们在 hashMap 中有一对 ["Programming", 7]。如果我们修改值 7 或 "Programming".
会发生什么第三个问题是开放的,听起来是这样的:没有任何字段的对象的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 这样的不可变键,但我无法意识到这是否足够对于招聘人员来说,由于这次面试不是面对面的。
老实说,这次面试有点混乱,因为招聘人员太神秘了,这就是为什么我想知道从你的角度来看,你是否能看到这三个问题的另一个底部,我可以添加一些额外的信息在我的回应中。
如果您能提出这些神秘问题背后的原因,我将不胜感激。
the interviewer asked why HashCode quality is so important in the situation when we have an object in HashMap and for some reason, we modified the value of one particular pair in HashMap.
哈希码质量对于在 HashMap
中正确分配密钥很重要。想象一下,如果所有的键都有相同的代码——我们需要线性数量的操作来找到一个键。
关于修改问题 - 假设我们有一个带有哈希码 5
的对象。
我们将它用作 HashMap
中的键来存储一些值。 HashMap
为 5
.
然后我们修改密钥而不删除它,所以它的哈希码现在是 10
。我们得到什么?哈希码 5
的存储桶中具有哈希码 10
的密钥。这很糟糕,因为现在我们将无法在 HashMap
.
然而,如果我们删除密钥,修改它,然后才将其恢复为原始值,那么一切都在它应该在的地方。
how we can calculate hashCode for the completely empty object(without any fields)
只需使用该对象的默认 Object.hashCode()
实现。不要覆盖 hashCode()
以下是在我正确理解问题的前提下:
问题 1 的答案: 是值的修改对 HashMap 键值的存储方式没有任何影响,但如果键和值不是不可变的,则更改也会反映在 HashMap 对象中。如果你在外面修改键,你可能无法从 HashMap 中找到对象,这就是为什么键应该是不可变的。
问题 2 的答案: 如果您不覆盖 class 中的 hashCode,则 JDK 提供的默认 hashCode 实现基于将传递的内存位置,因此无论对象是否为空。如果你覆盖 hashCode 那么无论你的 hashCode 函数做什么,结果都会是你写的。