为什么'=='即使我的哈希码值相同也会返回false

时间:2014-05-15 17:13:32

标签: java object hash reference hashcode

我写了一个像

这样的课程
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); 是假的?

请解释。

3 个答案:

答案 0 :(得分:1)

因为它们是两个不同的对象引用。 ==比较参考文献,而不是hashCode结果。

要获得所需的结果,您可以覆盖班级中的equals方法,并使用h1.equals(h2)查看它们是否相同。在这里,您可以使用hashCode的结果来简化对被比较对象的相等性的评估(这并不意味着具有相同哈希码的两个对象是等于的)。

但请注意,即使对象具有相同的hashCode并且与equals方法的定义相同,它们也是不同的引用,占据堆中的不同位置。

答案 1 :(得分:0)

正如@ZouZou指出的那样,hashCode平等并不等同于对象平等。话虽如此,你甚至没有比较对象的平等性。将两个对象与==进行比较是一个引用相等性检查,除非你真的知道自己在做什么,否则你几乎不应该使用它。

答案 2 :(得分:0)

你误解了hashCode的目的。正如其他人所指出的那样,==会比较引用而不是哈希码。但是,比较值而不是引用的重写equals方法仍然无法比较哈希码。

考虑一下......哈希码是int,因此哈希码只有2个 32 可能的值。但是有多少可能的String?许多,超过2 32 。 (由于每个char有2个 16 可能的值,因此有2个 48 可能String长度为3,并且这个数字不断增长String得到的时间越长。)因此,如果哈希码相等,则不可能设置两个String总是相等的方案。大多数其他对象也是如此(尽管可以使用每个值的唯一哈希码设置具有相对较少数量的可能值的类。)

hashCode的目的是提出一个可用于hashMaphashSet的号码。我们经常尝试提出一个函数来减少不等对象具有不等哈希码的机会,以提高映射或集合的效率。但是对于大多数物体来说,当然不能保证这一点。