• 重写equals方法的注意事项


     

    重写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方法的代码。

  • 相关阅读:
    车联网场景中的 MQTT 协议
    MQTT 遗嘱消息(Will Message)的使用
    为什么烧写SD卡的 image 总是报错?
    【友晶科技Terasic】无法下载Quartus软件,每次登录后又跳回到下载页面
    three.js在调整相机角度时导致的图形显示
    JOIG 2022 题解
    JOI 2021/2022 二次予選 题解
    Codeforces Round #769 (Div. 2) 题解
    WC2022 游记
    树莓派安装软件包时出现的很多依赖问题的解决
  • 原文地址:https://www.cnblogs.com/flyingsir/p/3958187.html
Copyright © 2020-2023  润新知