Set 的底层结构是什么?和 HashMap 的区别?
1 个回答
能治愈生活的良方,是保持对生活的热爱。小王子-B727## 1. Set 的底层结构 在 Java 中: * `HashSet` 是最常用的 `Set` 实现类 * **底层其实就是一个 `HashMap`** * 所有 `HashSet` 元素存储在这个 `HashMap` 的 **key** 位置,**value** 是一个固定的静态常量(占位符) 源码关键点(JDK 8): ```java public class HashSet<E> implements Set<E>, Cloneable, java.io.Serializable { private transient HashMap<E,Object> map; // 占位 value private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT) == null; } } ``` **说明**: * 元素放在 `HashMap` 的 key 上 → 自动保证不重复(key 唯一) * `value` 永远是同一个 `PRESENT` 对象 ## 2. Set vs HashMap 区别 | 对比项 | HashSet | HashMap | | --------- | ----------------------------- | ---------------- | | **存储结构** | 基于 `HashMap` 实现,只用 key | 键值对(key-value) | | **元素唯一性** | key 唯一(底层 HashMap 保证) | key 唯一,value 可重复 | | **存储内容** | 只有元素(放 key) | 键和值 | | **取值方式** | 不能通过 key 获取 value(因为没有 value) | 可通过 key 获取 value | | **用途** | 去重、判断是否存在 | 映射关系存储、按 key 查找 | ## 3. 其它 Set 实现 除了 `HashSet`,Java 还有: * **`LinkedHashSet`** → 底层是 `LinkedHashMap`(有插入顺序) * **`TreeSet`** → 底层是 `TreeMap`(红黑树,按元素排序) * **`EnumSet`** → 底层是位向量,专门存枚举类型 **总结**: `HashSet` 本质是 **用 HashMap 的 key 来存值**,value 是一个固定占位符,这就是为什么它能保证元素唯一;而 HashMap 是 key-value 对,功能更通用。发布于 2025-08-13 01:01 •IP属地 贵州举报评论收藏
公众号进入网站体验更佳

