在Java中使用实例解释equals()方法
在Java中,equals()
方法用于比较两个对象是否相等。虽然在Java中每个对象都继承自Object
类,因此默认情况下每个对象都有一个默认的equals()
方法,但是如果我们希望两个对象相等的概念不仅仅是对象的指针相等,也可以是对象的属性相等,这时我们就需要在我们的自定义类中重载equals()
方法。
重载equals()方法的一般原则
通常我们需要满足以下原则来为我们的自定义类重载equals()
方法:
- 自反性:一个对象应该等于它本身。
- 对称性:如果
a.equals(b)
为真,那么b.equals(a)
也应该为真。 - 传递性:如果
a.equals(b)
为真,b.equals(c)
也为真,那么a.equals(c)
也应该为真。 - 一致性:如果两个对象在任意时间都有相同的属性,那么它们应该一致地比较相等。(即,多次调用该方法,结果始终相同)。
- 非空性:任何一个对象不应该和
null
相等。
重载equals()方法的实现示例
下面我们来看一个简单的示例,来演示如何在一个自定义的类中重载equals()
方法。
首先,我们创建一个名为Person
的类,其中包含几个属性:姓名、年龄、性别。我们将在Person
类中重载equals()
方法,以使两个人的姓名、年龄、性别全部相同时,我们认为这两个人是相等的。
public class Person {
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (!(obj instanceof Person))
return false;
Person other = (Person) obj;
return this.name.equals(other.name)
&& this.age == other.age
&& this.gender.equals(other.gender);
}
// 同时重载hashCode()方法来与equals()方法一起使用
@Override
public int hashCode() {
int result = 17;
result = 31 * result + this.name.hashCode();
result = 31 * result + this.age;
result = 31 * result + this.gender.hashCode();
return result;
}
}
如上所示,我们重载了equals()
方法,并在其中判断了传入的对象是否为Person
类的实例,如果是,就比较两个Person
对象的三个属性是否全部相等。
此外,我们还重载了hashCode()
方法,因为在Java中,hashCode()
方法和equals()
方法一起使用可以提高程序性能,并且在使用HashMap
等Java
集合类时也需要正确重载hashCode()
方法。
接下来,我们可以编写测试类来测试上述类的equals()
方法是否正确:
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person("Joe", 17, "Male");
Person p2 = new Person("Joe", 17, "Male");
Person p3 = new Person("Mike", 23, "Male");
Person p4 = new Person("Joe", 18, "Male");
Person p5 = new Person("Joe", 17, "Female");
System.out.println("p1 equals p2: " + p1.equals(p2));
System.out.println("p1 equals p3: " + p1.equals(p3));
System.out.println("p1 equals p4: " + p1.equals(p4));
System.out.println("p1 equals p5: " + p1.equals(p5));
}
}
我们先创建了五个Person
对象,然后通过equals()
方法来比较它们是否相等。执行上述测试,我们会得到如下结果:
p1 equals p2: true
p1 equals p3: false
p1 equals p4: false
p1 equals p5: false
根据我们的实现,p1
和p2
有相同的名字、年龄和性别,因此我们认为它们是相等的;而p3
的名字、年龄和性别都和p1
不同,因此我们认为它们是不等的。同理,p4
和p5
也和p1
不同。
使用Objects类中的equals()方法
除了在自定义的类中重载equals()
方法之外,我们还可以使用Java 7中引入的Objects
类中的equals()
方法,它可避免因为调用null
对象的方法而导致的空指针异常。下面是使用Objects
类的示例:
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (!(obj instanceof Student))
return false;
Student other = (Student) obj;
return Objects.equals(this.name, other.name) && this.age == other.age;
}
@Override
public int hashCode() {
return Objects.hash(this.name, this.age);
}
}
如上所示,我们使用了Objects
类的equals()
和hash()
方法来替代了原来的name.equals(other.name)
和age == other.age
。
结论
通过上述例子的演示,我们可以总结出一些关于在Java中使用equals()
方法的一些最佳实践:
- 判断传入对象类型是否正确
- 使用
==
比较对象是否相等,使用equals()
比较对象内容是否相等 - 重载
hashCode()
方法 - 如果使用java.util包中的类(如List、Map、Set等),需要重载
equals()
和hashCode()
方法,以实现正确的对象比较和哈希值计算 - 在Java 7中,推荐使用
Objects
类中的equals()
和hash()
方法