HashSet基于HashMap实现,时间复杂度平均O(1),元素作为key存入,value为固定对象;须重写hashCode和equals以保证正确性;不维护顺序,不支持索引;扩容默认容量16、负载因子0.75。

HashSet 通过哈希表(HashMap)实现快速查找,内部不维护元素顺序,时间复杂度平均为 O(1)。
底层用 HashMap 存储
HashSet 实际上是包装了一层 HashMap:它把所有元素作为 key 存入 HashMap,value 固定用一个空的 Object(如 PRESENT)。因为 HashMap 基于数组 + 链表/红黑树实现,查找时先算 hash 值定位桶位置,再在桶内比对,所以无需遍历整个集合。
元素必须正确重写 hashCode 和 equals
这是快速且正确查找的前提:
- 两个逻辑相等的对象(equals 返回 true),hashCode 必须相同;否则可能被散列到不同桶,导致 contains 找不到
- 如果只重写 equals 不重写 hashCode,默认使用 Object 的哈希值(基于内存地址),对象即使内容相同也会被当作不同元素
- 建议用 IDE 自动生成或使用 Objects.hash(...) 构建 hashCode
不保证顺序,也不支持索引访问
HashSet 没有下标,不能用 get(i) 或按插入顺序遍历。如果需要顺序,可选:
立即学习“Java免费学习笔记(深入)”;
- LinkedHashSet:保持插入顺序,查找仍是 O(1),只是额外维护双向链表
- TreeSet:按自然序或自定义序排序,但查找降为 O(log n)
- 转成 List 再排序或索引访问——但会失去 HashSet 的查找优势
扩容机制影响性能稳定性
初始容量默认 16,负载因子 0.75。当元素数超过 capacity × loadFactor 时触发扩容(翻倍 + 重新哈希)。频繁扩容会影响性能,若已知大致元素量,建议构造时指定初始容量:
new HashSet(expectedSize) 或 new HashSet(expectedSize, loadFactor)


















