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()
对HashSet
或HashMap
集合对象所起的作用。
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方法