谈谈==,equals(),和hashcode()的关系和区别

最近一直在看javase的内容,发现自己对==,equals(),和hashcode()的关系有点不太清楚了,所以写下这篇博客记录一下。

首先,==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值:

int x = 10;
int y = 10;
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(x == y); // 输出true
System.out.println(str1 == str2); // 输出false

那equals()呢,其实,Object的equals方法,内部就是使用==来判断两个对象是否相等的,故equals比较的也是两个对象的地址值,下面附上Object源码:

 public boolean equals(Object obj) {
        return (this == obj);
    }

简单粗暴有没有。

搞清楚了==和equals()方法,我们再来看看hashcode(),hashcode()方法是通过对象在内存中的地址,算出对象的哈希码值,并将其返回。该方法一般是在集合类中操作,以提高查询效率。

那么equals()和hashcode()有什么关系呢,其实如果你不重写equals()方法,他们之前谈不上任何关系。但是,当你想要重写equals()方法时,你就得重写hashcode()方法,为什么呢?请看下面分析:

我们以经典的String对象为例,我们都知道String对象重写了equals()方法,在调用equals()方法时,只比较两个字符串的值是否相等,若相等,就返回true。那么问题来了,如果String只重写了equals()方法,而没有重写hashcode()方法,会怎么样?表面上看好像对我们使用equals()比较时没有任何影响,但是当我们使用集合(以HashSet为例)来保存String对象时,HashSet是通过对象的hashcode来保存对象的,当我们存入两个值相等的String对象时,由于我们没有重写String的hashcode()方法,他们的哈希码值是不相等的,所以两个值相等的String对象被存入到HashSet中,这和set集合保存的对象不能相等是相违背的。因此我们在重写equals()方法时,还得重写hashcode()方法。

到此,问题解决完毕,由于博主能力有限,如果内容有错,欢迎小伙伴指出。


猜你喜欢

转载自blog.csdn.net/Rekeless/article/details/80468541