HASHCODE认知

说实话,工作以来,hashcode一直知道,但是怎么用,为什么要重写重来没深究过,这次搞明白了,也分享一下。
equals方法在对象比较的时候相信大家都重写过,但是重写equals的同时重写hashcode方法,我所知道的大多数人是没有作这个操作的。
首先来说下,为什么要重写equals,如果不重写,那么默认比较的是对象的引用

public class Test3 {

private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}

public static void main(String[] args) {

Test3 t1 = new Test3();

Test3 t2 = new Test3();

System.out.println(t1.equals(t2));
}

}

这段代码的执行结果是false,因为t1和t2都是一个新的对象,那么在工作中,很多时候我们会遇到比较2个对象要求其中几个值相同即可的情况,列如下面

public class Test3 {

private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}


@Override
public boolean equals(Object obj) {
if(obj instanceof Test3){
return ((Test3) obj).getName().equals(name);
}
return super.equals(obj);
}
public static void main(String[] args) {

Test3 t1 = new Test3();
t1.setName("gk测试");
t1.setCode("1001");
Test3 t2 = new Test3();
t2.setName("gk测试");
t1.setCode("1002");
System.out.println(t1.equals(t2));
}


}

执行结果:true
重写equals之后只要name相同那么对象就会被认为相同。
说完了equals,来说一下hashcode,什么时候的比较会用到hashcode呢,Set和HashMap,大家都知道Set和HashMap的key值都备唯一性,那么这个唯一性是怎么判断的呢,不是简单的equals,试想一下,如果是equals,那么当装载数据量比较大的时候,岂不是每次数据新增都会equals 很多次,如果有10万条数据呢,这个显然是不现实的。实际上,Set和HashMap装载数据的时候都是先调用hashcde,如果hashcode不一样,那么就不会在进行一下比较了,如果hashcode存在,那么才会进行equals,这个时候的equals次数就非常少了,因为hashcode都确定了,这里得出一个结论,hashcode相同的对象不一定相同,但是hashcode不同的对象一定不同。
还是来段代码
public class Test3 {

private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}


@Override
public boolean equals(Object obj) {
if(obj instanceof Test3){
return ((Test3) obj).getName().equals(name);
}
return super.equals(obj);
}
public static void main(String[] args) {

Test3 t1 = new Test3();
t1.setName("gk测试");
t1.setCode("1001");
Test3 t2 = new Test3();
t2.setName("gk测试");
t1.setCode("1002");

Set<Object> set = new HashSet<Object>();
set.add(t1);
set.add(t2);
System.out.println(set.size());
}


}
上面代码执行出来为2,这表明t1和t2并不被认为是相同的,但是刚刚equals的话t1和t2是相同的,接下来我在重写hashcode

public class Test3 {

private String name;
private String code;
private String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}


@Override
public boolean equals(Object obj) {
if(obj instanceof Test3){
return ((Test3) obj).getName().equals(name);
}
return super.equals(obj);
}


@Override
public int hashCode() {
return name.hashCode();
}
public static void main(String[] args) {

Test3 t1 = new Test3();
t1.setName("gk测试");
t1.setCode("1001");
Test3 t2 = new Test3();
t2.setName("gk测试");
t1.setCode("1002");

Set<Object> set = new HashSet<Object>();
set.add(t1);
set.add(t2);
System.out.println(set.size());
}


}
重写hashcode之后,现在发现执行结果是1,t1和t2被认为是相同的对象了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值