关于equals方法的笔记

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 ) 检测 thisotherObject 是否引用同一个对象: if (this = otherObject) return true; 这条语句只是一个优化。实际上,这是一种经常采用的形式。因为计算这个等式要比一 个一个地比较类中的域所付出的代价小得多。
3 ) 检测 otherObject 是否为 null, 如果为 null, 返回 false。这项检测是很必要的。 if (otherObject = null ) return false;
4 ) 比较 thisotherObject 是否属于同一个类。如果 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 对覆盖类的方法进行标记,用其方法,如果出现错误,并且

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值