如何使用Objects类简单重写equals方法
equals()方法和hashCode()方法是什么?
equals()和hashCode()都是Object类中的方法。
equals方法用于比较两个对象是否相同;
hashCode方法是根据对象的地址或者字符串或者数字计算该对象的哈希值
为什么要重写equals()
- Object类中的equals方法比较的是两个对象的引用地址,只有对象的引用地址指向同一个地址时,才认为这两个对象相等,否则认为不相等。
- 如果有两个对象,我们需要判断其属性是否相等,那么默认的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());
}
这样,对于对象属性的比较就少了许多的代码量。