可能重复:
什么是对象哈希码
假设我创建了一个对象,该对象Employee具有id,firstName,lastName和电子邮件,用于实例变量和相应的setter/getter方法.hashCode()如果hashCode()在Employee对象存储在集合对象中时不覆盖对象,如何计算?
Cyr*_* Ka 25
如果不覆盖hashcode(),那么集合将使用Object类中的默认实现.此实现为不同的对象提供不同的值,即使它们根据equals()方法相等.
某些集合(如HashSet,HashMap或HashTable)使用哈希代码来存储其数据并检索它.如果您没有以一致的方式实现hashcode()和equals(),那么它们将无法正常运行.
根据Javadoc:Object.hashcode()通常通过将对象的内部地址转换为整数来实现,但Java(TM)编程语言不需要这种实现技术.因此,我建议不要依赖具体的实施.对于实现的实际操作,请参阅类似问题的答案.
从文档:
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术.)
所以基本上当你存储在Map/Set/somethingThatRequiresHashCode中时,JVM将使用该实例的内部存储器地址来计算hashCode,保证每个不同的实例都具有(尽管哈希函数保证任何东西 - 它们没有)一个独特的hashCode.
由于关于equals和hashCode的Object契约,这一点特别重要,因为:
类Object的equals方法实现了对象上最具辨别力的等价关系; 也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true).
如果不重写equals,它将比较两个引用的内部地址,它与hashCode背后的逻辑相匹配.
如果您的问题与以下内容更相关:JVM是否会查看实例中的值以确定相等/计算哈希码,答案是否定的,如果您这样做:
MyObject a = new MyObject("a", 123,"something");
MyObject b = new MyObject("a", 123,"something");
Run Code Online (Sandbox Code Playgroud)
a并且b将有不同的哈希码.
| 归档时间: |
|
| 查看次数: |
30303 次 |
| 最近记录: |