HashMap HashSet hashCode() 之间的联系

1. HashSet 是用 HashMap 实现的, 这个HashMap里面放入的key, 就是HashSet里面的值, value是Obeject类型的常量 public    static final

 

2.  HashMap 底层使用数组实现, put()方法的时候. 使用增加对象的hashCode()方法得到一个hash值, 然后根据这个值用hash算法得到数组的索引, 在该索引位置放入 Map.Entry 的一个引用. key 和 value 由Map.Entry对象维护.

HashMap 片段

HashSet 片段

 

 

在使用 HashMap 时,重写 hashcode 方法有其必要性和相关的规则及注意事项。 ### 重写 hashcode 方法的原因 若仅重写 equals() 而不重写 hashCode(),会直接违反“相等必同码”约定,进而导致哈希集合(如 HashMapHashSet)失效。例如在使用 HashMap 存储自定义对象时,若不重写 hashcode 方法,可能无法正确存储和查找对象 [^2]。 ### 重写 hashcode 方法的要求 重写 hashCode() 方法和 equals() 方法时,要求 hashCode() 方法结果应和 equals() 结果保持一致,即若 key1.equals(key2) 为 true,则 key1.hashCode() == key2.hashCode() 为 true。不过,当 key1.hashCode() == key2.hashCode() 为 true 时,key1.equals(key2) 未必为 true,因为可能存在 hash 冲突,即 key1 和 key2 不同但是其 hash 值相等 [^3]。 ### 编写 hashcode 方法的方式 编写 hashCode 方法时,对于实例域的哈希可以调用它自己的 hashCode,更好的方法是使用 Object.hashCode 方法避免 null 引起的问题 [^1]。 ### 重写 hashcode 方法的注意事项 如果重写了 equals 就必须重写 hashCode 方法,以保证 equals 相等的两个对象具有相同的 hashcode。若重写了 HashCode,但 equals 却返回 false,会发生 Hash 碰撞,也就是两个不同对象的 HashCode 相同,Hashmap 会试图把他们保存在同一个位置,又无法成功,就会在相应位置用链式结构保存多个对象,通过遍历链表进行 equals() 最终找到要找的值对象,不但违背了 Set 容器的规则,而且又使性能下降 [^1][^5]。 以下是一个简单的 Java 示例,展示如何重写 equals 和 hashcode 方法: ```java import java.util.Objects; class CustomKey { private int id; private String name; public CustomKey(int id, String name) { this.id = id; this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; CustomKey customKey = (CustomKey) o; return id == customKey.id && Objects.equals(name, customKey.name); } @Override public int hashCode() { return Objects.hash(id, name); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值