重写equals方法的注意事项

一。 在重写equals方法时,要注意满足离散数学上的特性

1   自反性:对任意引用值X,x.equals(x)的返回值一定为true.
2   对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3   传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4   一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5   非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

 

二。 在重写equals方法时,还要顺手把 hashCode方法一起重写了。

     这一点主要是考虑和集合类协同工作的需要。一般集合为加快存取速度,通常使用类hashtable的方式存取对象,

     hashCode() && equals() 则是判断待查找元素与集合中某个元素相等的依据。 而java中默认的hashCode是

     由对象的内存地址生成的, 如果重写了equals 而 重写 hashCode, 则会造成“A和B相等,A加入集合后,用B查询集合却查不到”的悖论。

 

 

当然了,以上只是约束条件,关键还是要符合自己设计的初衷,把最起码的相等判别逻辑给无视了。

 

三。重写equals方法的一般步骤:


1. 使用==操作符检查“实参是否为指向对象的一个引用”。 
2. 使用instanceof操作符检查“实参是否为正确的类型”。 
3. 把实参转换到正确的类型。 
4. 对于该类中每一个“关键”域,检查实参中的域与当前对象中对应的域值是否匹 配。

          a。对于既不是float也不是double类型的基本类型的域,可以使用==操作符进行比较(why?);

          b。对于对象引用类型的域,可以递归地调用所引用的对象的equals方法; 
      c。对于float类型的域,先使用Float.floatToIntBits转换成int类型的值, 然后使用==操作符比较int类型的值;

          d。对于double类型的域,先使用Double.doubleToLongBits转换成long类型的值,然后使用==操作符比较long类型的值。
5. 当你编写完成了equals方法之后,应该问自己三个问题:它是否是对称的、传 
  递的、一致的?(其他两个特性通常会自行满足)如果答案是否定的,那么请找到 
  这些特性未能满足的原因,再修改equals方法的代码。

 

equals()方法的作用是用于比较两个对象是否相等。在Java中,equals()方法是Object类提供的方法,它用于比较两个对象的引用是否相等,即判断两个对象是否指向同一个内存地址。 当我们需要自定义类的对象进行比较时,通常需要重写equals()方法重写equals()方法注意事项包括: 1. 重写equals()方法需要遵循一定的约定,即满足自反性、对称性、传递性和一致性。具体来说,就是: - 自反性:对于任意非空引用x,x.equals(x)应返回true。 - 对称性:对于任意非空引用x和y,如果x.equals(y)返回true,则y.equals(x)也应返回true。 - 传递性:对于任意非空引用x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,则x.equals(z)也应返回true。 - 一致性:对于任意非空引用x和y,在对象没有被修改的情况下,多次调用x.equals(y)应该始终返回相同的结果。 2. 重写equals()方法时需要进行类型检查,即通过instanceof关键字判断参数是否为同一类型。如果参数不是同一类型,则直接返回false。 3. 重写equals()方法时需要比较对象的各个属性是否相等。通常使用逻辑运算符(如&&)来比较属性的相等性。 4. 重写equals()方法时需要注意空值检查。即如果参数为null,则直接返回false,而不是抛出NullPointerException。 重写equals()方法是为了实现自定义类的对象比较,确保对象比较的准确性和一致性。只有重写equals()方法,才能在使用类的对象进行比较时得到期望的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值