我这个Student类已经重写了equals和hashCode,
,然后我测试类中这样写
,此时这个student1,student2应该是一个hashcode值,但是HashMap不是key不是不可以重复吗?为啥这里的map.put key为student1和student2不报错呢? 本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。 点击链接欢迎加入感兴趣的技术领域群。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Java中,HashMap
确实要求其键(key)是唯一的。但是,这里有一个关键点需要注意:键的唯一性是基于它们的hashCode
和equals
方法共同决定的。
当你重写了Student
类的equals
和hashCode
方法时,确保了如果两个Student
对象在业务逻辑上被认为是相等的(即equals
返回true
),它们也应该有相同的哈希码(通过hashCode
方法)。然而,即使两个对象的哈希码相同,它们在HashMap
中的存储位置可能相同(这称为哈希碰撞),但HashMap
内部会用链表或红黑树(取决于Java版本和桶内元素数量)来处理这种碰撞,从而保证每个键值对的唯一性。
具体到你的例子中,尽管student1
和student2
可能具有相同的哈希码,但在执行map.put(student1, "value1")
之后再执行map.put(student2, "value2")
时,由于你没有提到equals
的具体实现,我们假设如果student1
和student2
在业务逻辑上代表同一个学生(即它们的equals
方法比较结果为true
),那么第二次调用实际上是在更新已存在的键对应的值,而不是添加新的键值对。也就是说,最终的HashMap
中将只有一个键(这个键由student1
或student2
表示,因为它们在逻辑上是等价的),其对应的值将是最后一次调用put
方法时设置的值,即"value2"
。
如果equals
方法实现得当,确保逻辑上相等的对象被识别为相同,那么HashMap
就能正确地处理这种情况,不会报错,而是按照预期行为进行操作。因此,没有错误是因为你的实现符合HashMap
的工作原理。