深入理解Java中的equals和hashcode

深入理解Java中的equals和hashcode上午 10 14Equals 与 equals 比较两个对象的内容是否相等 比较两个声明对象是否引用内存中的同一对象 object 中的 equals 用的是 Hashcode 约定应用运行期间 对象内容未修改 多次执行 hashcode 返回相同

大家好,欢迎来到IT知识分享网。

上午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转换为相应的类类型变量:ClassName other = (ClassName)otherObject
  • 对各个域进行比较,==比较基本类型域,使用equals比较对象域,所有域都匹配就返回true
    • 子类中重新定义equals,就要在其中包含调用super.equals(other)
    • equals重写必须重写hashcode

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/98415.html

(0)
上一篇 2026-03-06 17:27
下一篇 2026-03-06 19:27

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信