前言
在Java集合框架中,`HashSet` 是一个非常常用的数据结构,它提供了高效的元素存储和查找功能。作为一种集合,`HashSet` 允许我们存储不重复的元素,并且在平均情况下可以实现常数时间复杂度的插入和查找。这一切的背后,`HashSet` 依赖于 `HashMap` 来实现其底层机制。本文将深入探讨 `HashSet` 的工作原理,包括其如何通过计算哈希值来管理元素、如何处理碰撞以及在存储容量不足时的扩容机制。通过示例代码,我们将逐步解析 `add` 方法的具体实现过程,帮助读者更好地理解这一重要数据结构的运作方式。
HashSet底层机制1
public class HashSet_ {
@SuppressWarnings("all")
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add("jack");
hashSet.add("tom");
hashSet.add("jack");
}
}
HashSet底层走的是HashMap()
public HashSet() {
map = new HashMap<>();
}
执行add()方法 e就是你传入进的值,PRESENT是一个静态object()空方法,目的就是为了站位能够用到put()方法
public boolean add(E e) {
return map.put(e, PRESENT)==null;//如果这里返回空就代表e这个值在这个并没有
}
传入的key就是上面的e,然后value就是PRESENT
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true); //如果这里返回空就代表成功了
}
求Key的hash值里面会到hashCode()方法,由于算法有点复杂就不追了,这个方法会得到key的hash值,但是这个hash值并不等价于hashCode,因为他里面还有算法
这个算法的设计可以理解为就是为了让key尽量得到不一样的hash值
static final int hash