hashCode() 在 HashSet 或 HashMap 中扮演啥角色 [重复]

Posted

技术标签:

【中文标题】hashCode() 在 HashSet 或 HashMap 中扮演啥角色 [重复]【英文标题】:What is the role played by hashCode() in a HashSet or HashMap [duplicate]hashCode() 在 HashSet 或 HashMap 中扮演什么角色 [重复] 【发布时间】:2016-06-26 22:55:40 【问题描述】:

this 问题的最高投票答案是:

当使用基于散列的集合或映射(例如 HashSet、LinkedHashSet、HashMap、Hashtable 或 WeakHashMap)时,请确保您放入集合中的关键对象的 hashCode() 在对象位于收藏。确保这一点的万无一失的方法是使您的密钥不可变,这还有其他好处。

老实说,我不明白hashCode()HashSetHashMap 集合对象所起的作用。

hashCode() 的关键对象方法如何在基于哈希的集合中使用? hashCode() 的对象在其生命周期中发生变化的情况可能是什么? 有人可以通过一些例子进一步详细说明这方面吗?

【问题讨论】:

不清楚您对“对象的 hashCode() 可能在其生命周期内发生变化的情况有什么问题?”正在尝试询问,但是如果您对对象进行变异,使得它们的哈希码在它们被用作哈希表中的键后发生变化,您将无法再次查找这些键... 基本上......这很复杂。您可以查看 Java 专家时事通讯 (javaspecialists.eu/archive/Issue235.html) 的最新一期,了解幕后需要什么。 作为对象在其生命周期中更改其哈希值的示例,请查看基于其内容的哈希值的众多集合。 【参考方案1】:

正如这篇博文中非常清楚地说明的那样,讨论:HashMap 在 Java 中的工作原理

Java 中的HashMap 基于散列原理工作。它是一种数据结构,如果我们知道密钥,它允许我们在恒定时间 O(1) 内存储和检索对象。在散列中,散列函数用于链接 HashMap 中的键和值。对象通过调用 HashMap 的 put(key, value) 方法存储,通过调用 get(key) 方法检索。当我们调用 put 方法时,会调用 key 对象的 hashcode() 方法,以便 map 的 hash 函数可以找到存储 value 对象的桶位置,这实际上是内部数组的索引,称为表。

阅读更多:http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html#ixzz42bvBzm6Y

【讨论】:

以上是关于hashCode() 在 HashSet 或 HashMap 中扮演啥角色 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

谈谈HashSet的存储原理及为什么重写equals必须重写hashcode方法

HashSet

Java19hashcode/hashset原理,Map,内部接口

关于HashSet的equals和hashcode的重写

hashCode equals hashSet

ArrayList_HashSet的比较及Hashcode分析