感觉网上很多博客要么抄,要么有的写的很晦涩难懂,所以按照自己的理解写了一份。
(1)两个对象相等,hashcode一定相等
(2)两个对象不等,hashcode不一定不等
(3)hashcode相等,两个对象不一定相等
(4)hashcode不等,两个对象一定不等
一句话总结:两个对象在equals逻辑上是认为相同的,没重写hashcode方法导致hash值不同。按照规则1 :相同的对象应该是有相同的hash值的。
详解原因:
假如有个自定义对象,重写equals方法在逻辑上来判断对象是否相等.
如:对象内部有个name变量,通过比较name是否相等来判断对象是否相等。
如果将该对象用于hashmap等集合类中作为key,假如两个对象,通过判断name是否相等来重写euqals方法,我们设置两个对象name为相同值,也就是说这两个对象逻辑上是相等的。
在逻辑上我们想使用这两个对象的name成员变量作为关键字插入到hashmap中。如果没有重写hashcode方法,那么将会使用object的hashcode方法,那么导致的结果就是两个不同对象equals判断是相等的,但是通过object hashcode生成的hash值可能是不等的,key(hash值)不同这就造成插入到hashmap中两个逻辑上相同对象,但是在map中存到了hash表中不同数组结点的链表中,也就是存在两份逻辑上相同的对象。
结果:在逻辑上我们认为这两个对象是相同对象,但是在map中因为key值(hash值)不同,认为这两个是不同的对象。按照关键字key唯一性的特点,不应该存在两个相同的key(对象)。
补充:
object hashcode方法:
- java6、7默认是返回随机数
- java8默认是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数
参考: