Java 如何重写对象的 equals 方法和 hashCode 方法,爆火的Java面试题

}

public void setName(String name) {

this.name = name;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

@Override

public String toString() {

return this.id + " " + this.name + " " + this.age;

}

@Override

public boolean equals(Object obj) {

if(this == obj){

return true;//地址相等

}

if(obj == null){

return false;//非空性:对于任意非空引用x,x.equals(null)应该返回false。

}

if(obj instanceof User){

User other = (User) obj;

//需要比较的字段相等,则这两个对象相等

if(equalsStr(this.name, other.name)

&& equals

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

Str(this.age, other.age)){

return true;

}

}

return false;

}

private boolean equalsStr(String str1, String str2){

if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2)){

return true;

}

if(!StringUtils.isEmpty(str1) && str1.equals(str2)){

return true;

}

return false;

}

@Override

public int hashCode() {

int result = 17;

result = 31 * result + (name == null ? 0 : name.hashCode());

result = 31 * result + (age == null ? 0 : age.hashCode());

return result;

}

}

三、测试


1、创建两个对象,名字和年龄相等则对象 equals 为 true。

@Test

public void testEqualsObj(){

User user1 = new User(“1”, “xiaohua”, “14”);

User user2 = new User(“2”, “xiaohua”, “14”);

System.out.println((user1.equals(user2)));//打印为 true

}

四、为什么要重写 equals 方法


因为不重写 equals 方法,执行 user1.equals(user2) 比较的就是两个对象的地址(即 user1 == user2),肯定是不相等的,见 Object 源码:

public boolean equals(Object obj) {

return (this == obj);

}

五、为什么要重写 hashCode 方法


既然比较两个对象是否相等,使用的是 equals 方法,那么只要重写了 equals 方法就好了,干嘛又要重写 hashCode 方法呢?

其实当 equals 方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。那这又是为什么呢?看看下面这个例子就懂了。

User 对象的 hashCode 方法如下,没有重写父类的 hashCode 方法

@Override

public int hashCode() {

return super.hashCode();

}

使用 hashSet

@Test

public void testHashCodeObj(){

User user1 = new User(“1”, “xiaohua”, “14”);

User user2 = new User(“2”, “xiaohua”, “14”);

Set userSet = new HashSet<>();

userSet.add(user1);

userSet.add(user2);

System.out.println(user1.equals(user2));

System.out.println(user1.hashCode() == user2.hashCode());

System.out.println(userSet);

}

结果

显然,这不是我们要的结果,我们是希望两个对象如果相等,那么在使用 hashSet 存储时也能认为这两个对象相等。

通过看 hashSet 的 add 方法能够得知 add 方法里面使用了对象的 hashCode 方法来判断,所以我们需要重写 hashCode 方法来达到我们想要的效果。

将 hashCode 方法重写后,执行上面结果为

@Override

public int hashCode() {

int result = 17;

result = 31 * result + (name == null ? 0 : name.hashCode());

result = 31 * result + (age == null ? 0 : age.hashCode());

return result;

}

所以:hashCode 是用于散列数据的快速存取,如利用 HashSet/HashMap/Hashtable 类来存储数据时,都会根据存储对象的 hashCode 值来进行判断是否相同的。

六、如何重写 hashCode


生成一个 int 类型的变量 result,并且初始化一个值,比如17

null ? 0 : age.hashCode());

return result;

}

[外链图片转存中…(img-nPoQY8if-1640577186334)]

所以:hashCode 是用于散列数据的快速存取,如利用 HashSet/HashMap/Hashtable 类来存储数据时,都会根据存储对象的 hashCode 值来进行判断是否相同的。

六、如何重写 hashCode


生成一个 int 类型的变量 result,并且初始化一个值,比如17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值