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

本文详细解释了Java SE中==运算符、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()方法。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值