重写 equals() 时没有重写 hashCode() 方法的话,使用 HashMap 可能会出现什么问题

hashMap、HashSet在比较元素时,会先通过hashCode进行比较,相同的情况下再通过equals进行比较。
所以:equals相等的两个对象,hashCode一定相等
hashCode相等的两个对象,equals不一定相等(比如散列冲突的情况)

重写了equals方法,不重写hashCode方法时,可能会出现equals方法返回为true,而hashCode方法却返回false。这样的一个后果会导致在hashmap、hashSet等类中存储多个一模一样的对象,这与java的思想不符(因为:hashmap只能有唯一的key,hashSet只能有唯一的对象)

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 如果在重写equals() 方法没有重写 hashCode() 方法,那么使用 HashMap 可能出现以下问题: 1. 在查询元素可能出现查询不到元素的情况,即使使用的是正确的键。这是因为在使用 HashMap 根据键的哈希值来查找元素,而如果没有重写 hashCode() 方法,那么每个对象的哈希值都相同,导致 HashMap 无法准确地找到对应的元素。 2. 如果在 HashMap 中插入了大量的元素,但是哈希值都相同,那么导致大量的冲突,使得查找的效率降低。 因此,在重写 equals() 方法后一定要同重写 hashCode() 方法,以保证 HashMap 的正常使用。 ### 回答2: 如果在重写equals()方法没有重写hashCode()方法使用HashMap可能出现以下问题: 1. 对象无法正确地放入HashMap中:HashMap是基于哈希表实现的,它使用hashCode方法确定对象在哈希表中的位置。如果没有重写hashCode方法,对象的默认hashCode方法根据对象的内存地址计算哈希码。这意味着即使两个对象的内容相等,它们的哈希码也可能不同,导致无法正确放入HashMap中。 2. 无法正确查找对象:HashMap在进行查找操作,先根据key的hashCode计算出对象在哈希表中的位置,然后再通过equals方法在该位置上的链表中查找目标对象。如果没有重写hashCode方法,将导致无法正确计算对象在哈希表中的位置,从而无法找到目标对象。 3. 重复对象无法正确识别:HashMap使用hashCodeequals方法判断两个对象是否相等。如果两个对象相等,那么它们的hashCode应该相等。如果没有重写hashCode方法可能导致两个对象虽然内容相等,但hashCode不同,导致HashMap无法正确识别重复对象,从而出现重复插入或无法正确删除的情况。 总之,由于HashMap是基于哈希表实现的,重写equals()方法必须同重写hashCode()方法,以保证对象在哈希表中的位置和相等判断的准确性。 ### 回答3: 当我们在重写equals方法没有重写hashCode方法的话,导致使用HashMap可能出现以下问题: 1. 键值无法正确存储和获取:HashMap是基于键值对存储数据的,其通过键的hashCode值来确定存储位置。如果没有正确重写hashCode方法导致哈希冲突,即不同的键所计算出的hashCode值相同,这样导致相同hashCode值的键值对无法正确存储和获取。 2. 无法正确判断键值相等:HashMap在存储键值对先判断键的hashCode值是否相等,如果相等再判断键值是否相等。如果没有正确重写hashCode方法导致无法准确判断两个对象的hashCode值是否相等,从而无法确定它们是否是同一个键值对。 3. 无法正确删除键值对:HashMap在删除键值对根据键的hashCode值和equals方法来判断键是否相等。如果没有正确重写hashCode方法,即使两个键的值相等但hashCode值不同,HashMap无法识别它们是同一个键,并无法正确删除对应的键值对。 综上所述,如果在重写equals方法没有正确重写hashCode方法导致HashMap无法准确存储、获取和删除键值对,可能出现数据存储错误和无法正常使用HashMap的情况。因此,我们在重写equals方法应该同重写hashCode方法,以保证正确运用HashMap
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值