为什么即使我的hashcode值相同,’==’也会返回false
我写了一个类似的课程
public class HashCodeImpl{ public int hashCode(){ return 1; } public static void main(String[] args) { // TODO Auto-generated method stub HashCodeUtil h= new HashCodeUtil(); HashCodeUtil h1= new HashCodeUtil(); System.out.println(h.hashCode()); System.out.println(h1.hashCode()); System.out.println(h); System.out.println(h1); System.out.println(h==h1); } }
输出:
1 com.manu.test.HashCodeUtil@1 com.manu.test.HashCodeUtil@1 false
我的问题是:当我的hashCode方法返回相同的值时,为什么System.out.println(h==h1);
是假的?
请解释。
因为它们是两个不同的对象引用。 ==
比较引用,而不是hashCode
结果。
要获得所需的结果,您可以覆盖类中的equals
方法并使用h1.equals(h2)
来查看它们是否相同。 在这里,您可以使用hashCode
的结果来简化对被比较对象的相等性的评估(这并不意味着具有相同哈希码的两个对象是等于的)。
但请注意,即使对象具有相同的hashCode
并且等效于equals
方法的定义,它们也是占用堆中不同位置的不同引用。
正如@ZouZou所指出的, hashCode
相等并不等同于对象相等。 话虽如此,你甚至没有比较对象的平等性。 使用==
比较两个对象是一个引用相等性检查,除非你真的知道自己在做什么,否则几乎不应该使用它。
你误解了hashCode
的用途。 正如其他人指出的那样, ==
比较引用而不是哈希码。 但是,重写的equals
方法(比较值而不是引用)仍然不会比较哈希码。
想一想……哈希码是一个int
,因此哈希码只有2 32个可能的值。 但是有多少可能的String
? 许多,超过2 32 。 (由于每个char
有2 16个可能的值,因此有2 48个长度为3的可能的String
,并且这个数字随着String
的获取时间越来越长而增长。)因此,不可能设置一个方案,其中两个String
是如果他们的哈希码相等则总是相等。 大多数其他对象也是如此(尽管可以使用每个值的唯一哈希码设置具有相对较少数量的可能值的类)。
hashCode
的目的是提出一个可用于hashMap
或hashSet
。 我们经常尝试提出一个函数来减少不等对象具有不等哈希码的机会,以提高映射或集合的效率。 但是对于大多数物体来说,当然不可能保证这一点。