最近一直在复习Java,发现最近一直对Java的hashCode和equals为什么一定要一起override不是很清楚,因此在复习的同时做下记录~~
API文件对有关hashCode()与equals有以下的相关规则:
(1) 如果两个对象相等,则hashcode必须也是相等
(2) 如果两个对象相等,对其中一个对象调用equals()必须返回true.也就是说,若a.equals(b)则b.equals(a)
(3) 如果两个对象有相同的hashcode值,它们也不一定是相等.但若两个对象相等,则hashcode值一定是相等的
原因: hashCode()所使用的杂凑算法可能会刚好会让多个对象传回相同的杂凑值,这取决与实现的杂凑算法.如果HashSet发现在比对的时候,同样的hashcode有多个对象,会使用equals()来判断两对象是否完全相等,也就是说hashcode是用来缩小寻找范围,最后要用equals()才能认定是否是相同的对象
(4) 因此若equals()被覆盖过,则hashCode()也必须被覆盖
(5) hashCode()的默认行为是对在heap上的对象产生独特的值,如果没有override过hashCode(),则该class的两个对象怎么都不会被认为是相同的
(6) equals()的默认行为是执行==的比较,也就是说回去测试两个引用是否对上heap上同一个对象.如果equals()没有被覆盖过,两个对象永远都不会被视为相同的,因为不同的对象有不同的字节组合
总之:a.equals(b)必须与a.hashCode() == b.hashCode()等值。
但是a.hashCode() == b.hashCode()不一定要与a.equals(b)等值。
分享到:
相关推荐
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
java中hashcode和equals的详解.pdf
关于hashCode()和equals()的本质区别和联系.doc
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。 使用hashCode()和equals() hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被...
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。下面这篇文章主要给大家介绍了关于java中hashCode、equals的使用方法,需要的朋友可以参考下。
hashcode、equals、==总结1简单总结.txt,他们之间的区别
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
本文档详细介绍了set接口为什么会用到hashCode和equals方法以及这两个方法的一些探讨 set不同的实现类用到的这两个方法也不同
解析Java对象的equals()和hashCode()的使用
javahashcode()和equals()和==的介绍和区别.pdf
更清楚的了解hashcode()和equals()方法。
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
Java中的equals()和hashCode()契约Java开发Java经验技巧共3页.pdf.zip
举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character
NULL 博文链接:https://songjianyong.iteye.com/blog/1676894
1、何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。 2、为什么改写equals()的时候,总是要改写hashCode() ... 3、什么是equals()与如何设计equals()
本文中详细的阐述了Java中经常遇到的equals、hashcode以及“==”号三者之间的区别
Java equals 方法与hashcode 方法的深入解析.rar