自定义对象作为map哈希表的 键key 时【为啥建议要重写hashCode( )、equals( ) 方法】

本文探讨了重写hashCode()和equals()方法的重要性,尤其是在哈希表中。hashCode()用于生成数组索引,而equals()用于解决哈希冲突,确保正确比较键值对。忽视可能导致数据覆盖的问题。
摘要由CSDN通过智能技术生成

目录

1,为啥建议要重写hashCode()?

2,为啥建议要重写 equals() 方法?

 3,疑惑:为啥要重写 equals(); 使用哈希值【即只重写hashCode()方法】比较不行吗?


1,为啥建议要重写hashCode()

■  为啥要重写hashCode(); //不重写,默认是比较内存地址。

✿ hashCode() 什么时候用、hashCode() 的作用? ---生成【哈希表(数组)】索引

ps:哈希表【本质上就是一个数组【索引-> 存储结点元素】

 索引:是先将计算得到的哈希值,与数组长度 & 【也可以%,不过效率不高】得出。

● 细节:计算出来得到的哈希值不同,但是经过&运算【结合考虑到数组长度】

2,为啥建议要重写 equals() 方法?

■  为啥要重写equals(); //不重写,默认是比较内存地址。

 ✿ equals() 什么时候用、equals() 的作用 ? ---解决hashCode 冲突时,比较两个key是否相等 

 3,疑惑:为啥要重写 equals(); 使用哈希值【即只重写hashCode()方法】比较不行吗?

当key 不同【例如key的类型不同,String、Integer最后可能算出来相同的hashCode】时,可能算出来相同的哈希值,可以得到相同的索引。导致新的【key-value】结点覆盖到原的【key-value】结点,发生hashCode冲突。

 

//重写equals() 用来比较两个对象【例如两个对象的引用作为 key 存储在哈希表map 中,重写equals() 就可以比较key 是否相等。】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
哈希表的索引是根据值(key)通过哈希函数计算得出的一个整数值。在Java中,哈希表的索引可以通过HashMap类中的hashCode()方法equals()方法来计算和比较。具体实现可以参考以下代码: ``` public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public static void main(String[] args) { Map<Student, String> map = new HashMap<>(); Student s1 = new Student("Tom", 18); Student s2 = new Student("Jerry", 20); Student s3 = new Student("Tom", 18); map.put(s1, "A"); map.put(s2, "B"); map.put(s3, "C"); System.out.println(map.get(s1)); // A System.out.println(map.get(s2)); // B System.out.println(map.get(s3)); // C } } ``` 在上面的代码中,我们创建了一个Student类,并重写了它的hashCode()方法equals()方法。其中,hashCode()方法返回的是一个整数值,这个值可以根据对象的属性计算而来,一般需要保证相同的对象返回相同的hashCode值,不同的对象返回不同的hashCode值。equals()方法用于比较两个对象是否相等,一般需要根据对象的属性进行比较。 接下来,在main方法中,我们创建了一个HashMap对象,并向其中添加了三个Student对象。由于s1和s3的属性相同,因此它们的hashCode值也相同,equals方法返回true,所以s3的值会覆盖s1的值,最终map中只有两个元素。当我们通过s1、s2、s3分别获取map中的值,可以得到"A"、"B"、"C"三个值,这说明我们成功地通过哈希表的索引进行了对象的查找。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟庭大师兄

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值