重写equals()时为什么也得重写hashCode()
1.hashCode()方法
hashCode()方法是Object的一个方法,通过方法可以计算出调用对象的哈希值,也就是该对象的存储地址。
很多类在改写equals()方法后,都改写过hashCode()方法。
比如String:
String str =”myHome” ;
String str1 = new String(“myHome”);
str == str1 //返回false,因为它们的存储地址不一样
//但是
str.hashCode() == str1.hashCode() //返回true。因为String类改写了hashCode()方法,此时的hashCode()方法并不是计算对象的存储地址了。
2.重写equals()但不重写hashCode()
对于Map集合来说,可以通过map.get(key)来获取value的值。其中的过程与map集合的结构有关,简单来说就是通过计算key的哈希值,来获取value的映射地址,从而找到value。
那么,问题来了。
此时有一个类KeyClass,它重写了equals()方法,但是没有重写hashCode()方法。
则:
KeyClass key1 = new KeyClass("myHome");
KeyClass key2 = new KeyClass("myHome");
Map map = new Map();
map.put(key1,"Hello");
map.get(key1); // Hello
map.get(key2); //null
由于重写了equals(),很显然 key1.equals(key2) 返回ture。
但是由于KeyClass类没有重写hashCode,所以key1.hashCode()和key2.hashCode()调用的是Object类的,计算的是这两个的存储地址,显然不一样。所以在map中存储key1的哈希值,在map.get(key2)是获取不到value的值。
以上便是为什么重写equals()时也得重写hashCode()。
如果不是用在map集合上,是否一定要重写hashCode()呢?这个问题,后期查了再更新,我也有这个疑惑。
参考文档:https://blog.csdn.net/javazejian/article/details/51348320
上一篇: 5. Python的模块
下一篇: 使用python自动办公的实例代码
推荐阅读
-
why在重写equals时还必须重写hashcode方法分享
-
why在重写equals时还必须重写hashcode方法分享
-
java中重写equals()方法的时候为什么要重写hashCode()方法?
-
哈希表中为什么要重写hashCode与equals方法
-
Java中为什么要重写hashCode方法和equals方法?
-
为什么重写equals方法后必须重写hashCode方法?
-
为什么重写equals必须重写hashCode的基础分析
-
重写equals方法为什么要重写hashCode方法
-
为何修改equals方法时还要重写hashcode方法的原因分析
-
Java面试题:重写了equals方法,为什么还要重写hashCode方法?