您的位置 首页 java

深入理解Java中的equals和hashcode

上午10:14

Equals 与 ==

  • equals比较两个对象的内容是否相等
  • ==比较两个声明对象是否引用内存中的同一对象
  • object中的equals用的是==

hashcode 约定

  • 应用运行期间,对象内容未修改,多次执行hashcode返回相同int值,多次执行同一应用,不强制要求返回相同整数值
  • 两个对象equals方法相等,hashcode方法返回值必须相等
  • 两个对象equals方法返回值不相等,不要求两个对象的hashcode方法必须不相等

Equals重写规则

  • 自反性 非null的x,x.equals(x)应返回true
  • 对称性 非null的x和y, x.equals(y),必须y.equlas(x)也返回true
  • 传递性 x.equals(y)=true, y.equlas(x)=true,即x.equals(z)=true
  • 一致性 对象未被修改,多次调用equals方法,始终返回相同结果

重写equals为什么必须重写hashcode?

  • hashcode方法约定 ,equals方法相等,必须hashcode方法返回值也相等,如果不重写hashcode方法,hashcode仍然采用继承自object类的hashcode方法,比较的是内存引用,就会导致equlas相等,hashcode不相等的情况发生
  • hashmap 在put数据时,判断两个key是否相等,先判断hash值,再判断equals值, hash 值判断起来高效一些,所以放置在前边进行判断,hash值不相等,equals必然不相等

equals重写建议

  • 显式命名otherObject
  • 判断是否==,如果相等,直接返回true
  • 检测otherObject是否为null,为null则返回false
  • 比较this与otherObject是否属于同一类
    • 如果equals语义在每个子类中有所改变,就使用getClass检测,if(getClass()!=otherObject.getClass()) return false
    • 如果子类对于equals有统一语义,就用instanceOf检测, if (!(otherObject instanceOf ClassName)) return false
  • 将otherObject转换为相应的类类型变量: Class Name other = (ClassName)otherObject
  • 对各个域进行比较,==比较基本类型域,使用equals比较对象域,所有域都匹配就返回true
    • 子类中重新定义equals,就要在其中包含调用super.equals(other)
    • equals重写必须重写hashcode

文章来源:智云一二三科技

文章标题:深入理解Java中的equals和hashcode

文章地址:https://www.zhihuclub.com/185331.shtml

关于作者: 智云科技

热门文章

网站地图