其他分享
首页 > 其他分享> > 为什么在重写了equals()方法之后也必须重写hashCode()方法

为什么在重写了equals()方法之后也必须重写hashCode()方法

作者:互联网

Java代码:

  1. public class Test

  2. {

  3. public static void main(String[] args)

  4. {

  5. HashMap hm = new HashMap();

  6. key k = new key(1);   //******(1)

  7. value v = new value(2);

  8. hm.put(k, v);

  9. if(hm.containsKey(k))  //*********(2)

  10. System.out.println(hm.get(k));  //*********(3)

  11. else

  12. System.out.println(“dont have such a key”);

  13. }

  14. }

注意:我这里的hashmap中的key是自己new出的一个对象,然后把对象的引用作为key的,这里突出了hashmap的查找原理,hashmap是通过key的hashcode来找到hashmap中的key,这里我在hashmap的key中是放一个对象的引用,我去拿key的时候也是通过这个引用,所以(1)处的key 与(2)、(3)处的key是完全一样的,所以这段程序没有任何问题,顺利运行。

现在我把测试类改一下

Java代码:

  1. public class Test

  2. {

  3. public static void main(String[] args)

  4. {

  5. HashMap hm = new HashMap();

  6. hm.put(new key(1),new value(2));

  7. if(hm.containsKey(new key(1)))

  8. System.out.println(hm.get(new key(1)));

  9. else

  10. System.out.println(“dont have such a key”);

  11. }

  12. }

注意区别,我这里hashmap中key放的不是引用,而是new出来的对象,然后我去get或者containsKey的时候也通过new一个key去拿,虽然我们初始化内容完全相同,都是放 int 1 进去,也就是说对象内容完全相同,但最后结果确实输出"dont have such a key"。

找原因,为什么内容相同,但找不到这个key呢,前面说了hashmap是通过hashcode来找key的位置,这是关键,你每次new 一个新对象出来hashcode肯定不一样,所以你拿不到你要的key。

解决方法,重写你编写的key类的hashcode方法。

Java代码:

  1. class key

  2. {

  3. int i ;

  4. public key(int i)

  5. {

  6. this.i = i;

  7. }

  8. @Override

  9. public boolean equals(Object obj)

  10. {

  11. if(obj instanceof key)

  12. {

  13. if(((key)obj).i == i)

  14. return true;

  15. }

  16. return false;

  17. }

  18. @Override

  19. public int hashCode()

  20. {

  21. return i;

  22. }

  23. }

我们先不要看equals的重写,这里我们重写了hashcode这个方法,让它返回一个我们初始化进去的i,这样你每次new一个对象,因为是通过hashcode找key,而你的hashcode有只是值i,所以只要i相等,你就可以找到你的key的地址,注意,只是找到你要的key的地址,但key是不是同一个key还不一定。然后我们开始比较我们传来的寻找value的key和hashmap中的key

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

是不是同一个key,如果是那就找到了value。

在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样,所以我们还要重写equals这个方法,让重写后的equals方法来比较我们对象里特有的东西。

重写equals方法一般按照如下步骤:

标签:hashmap,equals,hashCode,key,hm,new,重写
来源: https://blog.csdn.net/m0_65637891/article/details/122158574