关于Java重写equals()方法的步骤

本文围绕Java语言中equals方法的特性展开,包括自反性、对称性等。介绍了重写equals()方法的步骤,如参数命名、对象引用检测等。同时强调重新定义equals()方法时必须重写hashCode()方法,且二者定义要保持一致,并给出了重写hashCode()方法的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java语言规范要求equals方法具有下面的特性:

  1. 自反性:对于任何非空引用x,x.equals(x)应该返回true
  2. 对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true
  3. 传递性:对于任何引用x和y和z,如果x.equal(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true
  4. 一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果
  5. 对于任意非空引用x,x.equals(null)应该返回false

重写equals()方法的步骤:

  • 显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量
  • 检测this与otherObject是否引用同一个对象
if (this == otherObject) 
    return true;
  • 检测otherObject是否为null,是则返回false
if (this == null) 
    return false;
  • 比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass检测
if (getClass() != otherObject.getClass()) 
    return false;
  • 如果所有的子类都拥有统一的语义,就使用instanceof检测
if (!(otherObject instanceof ClassName)) 
    return false;
  • 将otherObject转换成相应的类类型变量
ClassName other = (ClassName) otherObject
  • 将other需要比较的域成员都进行比较,只要有一个不同都返回false

需要注意的是,如果重新定义了equals()方法,就必须重新定义hashCode()方法,以便用户可以将对象插入到散列表中。equals()方法与hashCode()方法的定义必须保持一致,即如果equals()返回true,则2个对象的hashCode()必须具有相同的值。重写equals()方法中有提到,我们需要将要比较的域成员都进行比较,那么我们在重写hashCode()方法时可以将这些域成员的散列值组合起来,这样就能保证它与equals()方法具有一致性了。假设需被比较的域成员为field_1、field_2与field_3,那么我们可以编写一下hashCode()方法:

public int hashCode() {
    return Objects.hash(field_1, field_2, field_3);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值