1.equals 方法
Object 类中的 equals方法用于检测一个对象是否等于另外一个对象。在 Object 类中,这 个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相 等的。
以比较两个Employee 为例来演示equals方法的实现
import java.time.LocalDate;
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name, double salary, int year, int month, int day) //构造器
{
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
}
public String getName()
{
return name;
}
public double getSalary()
{
return salary;
}
public LocalDate getHireDay() {
return hireDay;
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
public boolean equals(Object otherObject) {
if (this == otherObject) return true;// a quick test to see if the objects are identical
if (otherObject == null ) return false;// must return false if the explicit parameter is null
if (getClass() != otherObject.getClass()) return false;// if the classes don't match, they can' t be equal
Employee other = (Employee) otherObject;// now we know otherObject is a non-null Employee
return Obeject.eqauls(name,other.name) // test whether the fields have identical values
&& salary = other.salary
&& Object.eqauls(hireDay,other.hireDay);
//防止name 与 hireDay 为 null
}
getClass方法将返回一个对象所属的类
2.equals 方法具有的特性
(1)自反性:对于任何非空引用 x, x.equals(x)应该返回 true.
(2)对称性:对于任何的引用的x和y,当且仅当y.equals(x),返回true,x.equals(y)也应该返回true.
(3)传递性:对于任何引用x、y和z,如果x.eqauls(y)返回true,y.eqauls(z)返回true,x.equals(z)也应该返回true.
(4)一致性:如果x和y的引用的对象没有发生变化,反复调用x.eqauls(y)应该返回同样的结果.
(5)对于任意非空引用x,x.equals(null)应该返回false.
3.编写一个完美的eqauls方法的建议
1 ) 显式参数命名为 otherObject
, 稍后需要将它转换成另一个叫做 other
的变量。
2 ) 检测 this
与 otherObject
是否引用同一个对象: if (this = otherObject) return true;
这条语句只是一个优化。实际上,这是一种经常采用的形式。因为计算这个等式要比一 个一个地比较类中的域所付出的代价小得多。
3 ) 检测 otherObject
是否为 null
, 如果为 null
, 返回 false
。这项检测是很必要的。 if (otherObject = null ) return false;
4 ) 比较 this
与 otherObject
是否属于同一个类。如果 equals
的语义在每个子类中有所改变,就使用 getClass
检测: if (getClass() = otherObject.getCIassO) return false;
如果所有的子类都拥有统一的语义,就使用 instanceof
检测: if (!(otherObject instanceof ClassName)) return false;
5 ) 将 otherObject
转换为相应的类类型变量: ClassName other = (ClassName) otherObject
6 ) 现在开始对所有需要比较的域进行比较了。使用=比较基本类型域,使用 equals
比较对象域。如果所有的域都匹配,就返回 true
; 否则返回 false
。
return field1 == other.field1
&& Objects.equa1s(fie1d2, other.field2)
&&...;```
如果在子类中重新定义 equals
, 就要在其中包含调用super.equals(other)
。
Warning:在方法声明时显式参数类型要为Object,否则就定义了一个完全无关的方法,可以使用@Override 对覆盖类的方法进行标记,用其方法,如果出现错误,并且