java hashset如何存储
HashSet 的存储原理
HashSet 是基于哈希表实现的集合,底层使用 HashMap 来存储元素。HashSet 只存储键(Key),而值(Value)则统一存储为一个静态的 Object 对象。
存储过程
当向 HashSet 添加元素时,实际上是将该元素作为键(Key)存入底层的 HashMap 中。HashMap 的值为一个固定的 PRESENT 对象(静态常量)。
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
哈希冲突处理
HashSet 使用哈希算法确定元素的存储位置。当哈希冲突发生时,采用链表或红黑树(JDK 8+)来处理冲突。
- 哈希冲突较少时,使用链表存储冲突元素。
- 当链表长度超过阈值(默认为 8),且数组长度大于等于 64 时,链表转换为红黑树。
元素唯一性保证
HashSet 通过元素的 hashCode() 和 equals() 方法确保唯一性。添加元素时:
- 计算元素的
hashCode()确定存储位置。 - 如果该位置为空,直接存入。
- 如果该位置非空,调用
equals()比较元素是否相同。相同则拒绝添加,不同则处理冲突。
扩容机制
当 HashSet 的元素数量超过负载因子(默认 0.75)与当前容量的乘积时,触发扩容。扩容时,容量变为原来的 2 倍,并重新计算所有元素的哈希位置。

static final float DEFAULT_LOAD_FACTOR = 0.75f;
性能特点
- 添加、删除、查找操作的平均时间复杂度为 O(1)。
- 元素无序,遍历顺序不固定。
- 线程不安全,多线程环境下需外部同步。






