hashset通过哈希表实现自动去重,依赖元素的hashcode()和equals()方法;添加元素用add()方法,重复时返回false;自定义类必须同时重写这两个方法以保证唯一性,且允许一个null元素。

HashSet 通过哈希表实现,添加元素时自动去重,关键在于元素的 hashCode() 和 equals() 方法是否合理。
添加元素:用 add() 方法
调用 add() 即可插入元素,返回 boolean 值:成功添加返回 true,重复元素返回 false。
- 内部先计算元素的
hashCode(),定位到哈希桶(数组索引) - 若桶中无元素,直接存入;若有,则逐个调用
equals()比较 - 只有
hashCode()相同 且equals()返回true,才判定为重复
保证唯一性的前提:正确重写 hashCode 和 equals
对于自定义类,若不重写这两个方法,不同对象即使内容相同,也会被当作不同元素存入。
- 例如:
Person类两个实例姓名年龄都一样,但默认hashCode()是内存地址,equals()是引用比较 → 会被重复添加 - 必须同时重写:
hashCode()应基于参与逻辑相等判断的字段计算;equals()要满足自反、对称、传递、一致、非空性 - IDE(如 IntelliJ)可一键生成合规的
hashCode()和equals()
注意 null 元素的特殊处理
HashSet 允许且仅允许一个 null 元素。
-
add(null)第一次返回true,之后再加返回false - 底层把
null固定放在哈希表索引为 0 的位置,用==判断是否已存在
简单示例
以下代码能正确去重:
Set<string> set = new HashSet();
set.add("apple"); // true
set.add("apple"); // false,不重复添加
set.add(null); // true
set.add(null); // false</string>
对自定义类,务必确保 hashCode() 和 equals() 逻辑一致,否则唯一性无法保障。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











