覆盖/重写Object类中equals方法
程序员文章站
2022-04-15 23:45:29
...
我们在写程序时,往往有时Java类库中的equals方法不能满足我们的需求。这时,就需要我们自己来定义equals方法。
在写自定义equals方法之前,我满先来看两个类库中已经写好的equals方法。
一、Object.equals()
很简单的一个方法,因为是Object的方法,所以对所有对象都适用。
public boolean equals(Object obj) {
return (this == obj);
}
二、String.equals()
private final char value[];
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
我们来看String类重写equals方法时,都做了些什么。
首先是判断是不是自己,如果是自己好办,直接返回true就完事了。
然后如果不是自己,先看看传入的参数是否为String类型,不是返回false就完事。
再然后都是String类型了,在比较长度是否相等,每个字符的值是否相等,全都相等就返回true。
三、自定义equals()
通过模仿String.equals(),我们来写Person.equals()。
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean equals(Object another) {
//先判断是不是自己,提高运行效率
if (this == another)
return true;
//再判断是不是Person类,提高代码的健壮性
if (another instanceof Person) {
//向下转型,父类无法调用子类的成员和方法
Person anotherPerson = (Person) another;
//最后判断类的所有属性是否相等,其中String类型和Object类型可以用相应的equals()来判断
if ((this.getName().equals(anotherPerson.getName())) && (this.getAge() == anotherPerson.getAge()))
return true;
} else {
return false;
}
return false;
}
}
}
在覆盖equals()时,我们在自定义equals内部调用了Object.equals()和String.equals()。
四、自动生成的equals()
考虑到实际中我们可能会经常覆写equals(),因此eclipse为我们提供自动生成的equals()。
操作过程如上图所示,读者可自行操作查看自动生成的代码。
推荐阅读
-
Java中如何正确重写equals方法
-
PHP中类的继承与方法重写
-
对python中类的继承与方法重写介绍
-
java基础 静态 static 问在多态中,子类静态方法覆盖父类静态方法时,父类引用调用的是哪个方法?
-
在C#的类或结构中重写ToString方法的用法简介
-
Java中的Object类的几个方法
-
荐 java父类-Object类-equals与==-方法的重载和重写-游离块-this关键字
-
关于Object类中的wait()和notify()方法实现生产者和消费者模式
-
java中重写equals()方法的时候为什么要重写hashCode()方法?
-
哈希表中为什么要重写hashCode与equals方法