开发者社区 问答 正文

Student类重写了equals和hashCode

我这个Student类已经重写了equals和hashCode,

,然后我测试类中这样写 image.png

,此时这个student1,student2应该是一个hashcode值,但是HashMap不是key不是不可以重复吗?为啥这里的map.put key为student1和student2不报错呢?image.png 本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。 点击链接欢迎加入感兴趣的技术领域群。

展开
收起
游客pklijor6gytpx 2019-10-10 15:54:31 568 分享 版权
阿里云 AI 助理回答

在Java中,HashMap确实要求其键(key)是唯一的。但是,这里有一个关键点需要注意:键的唯一性是基于它们的hashCodeequals方法共同决定的。

当你重写了Student类的equalshashCode方法时,确保了如果两个Student对象在业务逻辑上被认为是相等的(即equals返回true),它们也应该有相同的哈希码(通过hashCode方法)。然而,即使两个对象的哈希码相同,它们在HashMap中的存储位置可能相同(这称为哈希碰撞),但HashMap内部会用链表或红黑树(取决于Java版本和桶内元素数量)来处理这种碰撞,从而保证每个键值对的唯一性。

具体到你的例子中,尽管student1student2可能具有相同的哈希码,但在执行map.put(student1, "value1")之后再执行map.put(student2, "value2")时,由于你没有提到equals的具体实现,我们假设如果student1student2在业务逻辑上代表同一个学生(即它们的equals方法比较结果为true),那么第二次调用实际上是在更新已存在的键对应的值,而不是添加新的键值对。也就是说,最终的HashMap中将只有一个键(这个键由student1student2表示,因为它们在逻辑上是等价的),其对应的值将是最后一次调用put方法时设置的值,即"value2"

如果equals方法实现得当,确保逻辑上相等的对象被识别为相同,那么HashMap就能正确地处理这种情况,不会报错,而是按照预期行为进行操作。因此,没有错误是因为你的实现符合HashMap的工作原理。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: