如何使用Objects类简单重写equals方法

如何使用Objects类简单重写equals方法

equals()方法和hashCode()方法是什么?

equals()和hashCode()都是Object类中的方法。

equals方法用于比较两个对象是否相同;

hashCode方法是根据对象的地址或者字符串或者数字计算该对象的哈希值

为什么要重写equals()

  1. Object类中的equals方法比较的是两个对象的引用地址,只有对象的引用地址指向同一个地址时,才认为这两个对象相等,否则认为不相等。
  2. 如果有两个对象,我们需要判断其属性是否相等,那么默认的equals方法就不符合我们的要求了,这个时候我们就需要对equals方法进行重写以满足我们的需求。

为什么java中在重写equals()方法后必须重写hashCode()方法

为了维护hashCode()方法的equals协议

如果根据equals()方法,两个对象是相等的,那么对这两个对象的每个对象调用hashCode()方法都必须生成相同的整数结果;而两个hashCode()返回的结果相等时,两个对象的equals()方法不一定相等。

在这里我们只讲解equals方法

首先我们先准备两个学生类,该类的属性有:学号,姓名,性别,年龄,专业。

代码如下:

public class Student {
	/**学号*/
	private String sno;
	/**姓名*/
	private String name;
	/**性别*/
	private String sex;
	/**年龄*/
	private int age;
	/**专业*/
	private String major;
}

在这里,我们认为两个学生的学号和姓名同时相等时则认为两个学生相等。

首先,我们使用Eclipse自动生成equals方法:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Student other = (Student) obj;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    if (sno == null) {
        if (other.sno != null)
            return false;
    } else if (!sno.equals(other.sno))
        return false;
    return true;
}

可以看出这段代码是很繁琐的。

我们分析一下这段代码,可以发现其有许多对空的判断,这些判断导致了代码的繁琐。而Objects类里提供了空指针安全的对象比较,于是上面的代码就可以减少许多代码量。

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Student other = (Student) obj;
    return Objects.equals(this.getName(), other.getName()) && Objects.equals(this.getSno(), other.getSno());
}

这样,对于对象属性的比较就少了许多的代码量。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值