java - 如果hashCode没有被覆盖会怎么样?

use*_*323 4 java hashcode

可能重复:
什么是对象哈希码

假设我创建了一个对象,该对象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)编程语言不需要这种实现技术.因此,我建议不要依赖具体的实施.对于实现的实际操作,请参阅类似问题的答案.

  • 请注意,您不能指望获取不同hashCode值的不同对象.特别是,64位JVM可能拥有比不同int值更多的对象.随着内存大小的增加,这将变得更加实用. (2认同)

pca*_*cao 8

从文档:

尽可能合理,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将有不同的哈希码.