HashSet添加元素用add()方法,返回boolean值;基于hashCode()定位、equals()判重;支持单个null;底层用HashMap实现,key为元素、value为固定对象;自定义类须重写hashCode()和equals();不保证顺序,需有序时选LinkedHashSet或TreeSet。

添加元素用 add() 方法
调用 add() 方法即可向 HashSet 中插入一个元素。该方法返回 boolean 值:成功添加返回 true,元素已存在则不添加、返回 false。
- 每次添加都基于对象的 hashCode() 计算存储位置
- 若位置已有元素,再通过 equals() 判断是否重复
- 重复时直接忽略,集合大小不变
- 支持添加 null,但只能有一个(因为
null.equals(null)视为相等)
底层靠 HashMap 存储
HashSet 本身不存数据,它内部维护一个 HashMap 实例,把要添加的元素作为 key,统一用一个固定值(如 PRESENT)作为 value。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 所以添加
set.add("abc"),本质是执行map.put("abc", PRESENT) - 利用 HashMap 的 key 唯一性,自然保证了 Set 元素不重复
- 哈希表结构(数组 + 链表/红黑树)支撑了 O(1) 平均时间复杂度的增删查
自定义对象要注意重写 hashCode 和 equals
如果往 HashSet 中添加自定义类的对象,默认使用 Object 类的 hashCode() 和 equals(),会导致逻辑出错——两个内容相同但不同实例的对象被当作不同元素。
- 必须在类中正确重写这两个方法,确保“内容相等”的对象返回相同 hash 值且
equals()返回 true - 例如:两个
new Person("张三", 25)对象,应视为同一个元素 - IDE(如 IntelliJ)可一键生成合规的
hashCode和equals
添加后顺序不可预测
HashSet 不保证元素的插入顺序或遍历顺序,输出看起来“乱序”,这是正常现象。
- 顺序由元素 hash 值决定,受初始容量、扩容、哈希分布影响
- 同一段代码多次运行,只要元素不变,输出顺序通常是稳定的(不是随机)
- 如需有序,改用 LinkedHashSet(按插入顺序)或 TreeSet(按自然/定制顺序)










