HashSet去重关键在于重写equals()和hashCode()方法,而非泛型;二者须成对出现、逻辑一致,仅基于业务唯一字段(如studentId)计算,否则默认比较内存地址导致重复项无法过滤。

HashSet 结合泛型过滤自定义对象重复项,关键不在泛型本身,而在于你是否让对象“说清楚自己什么时候算重复”。泛型只是帮你把类型安全地框住(比如
为什么光靠泛型不行
泛型在编译期做类型检查,运行时被擦除。new HashSet
必须重写 equals() 和 hashCode()
这两个方法要成对出现、逻辑一致,且只基于**业务上判定重复的字段**:
- 比如 Student 按学号(studentId)唯一,那就只用 studentId 参与比较和哈希计算
- 如果业务规则是“学号+姓名”都相同才算重复,那两个方法里都得同时用这两个字段
- 字段一旦参与 equals 判断,就必须出现在 hashCode 计算中;反之亦然
正确写法示例(以学号为唯一标识)
注意:使用 Objects.equals() 和 Objects.hash() 可避免空指针,推荐直接套用
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(studentId, student.studentId);
}
@Override
public int hashCode() {
return Objects.hash(studentId);
}
验证去重效果
写完后直接测试:
Set<student> set = new HashSet();
set.add(new Student("S001", "张三"));
set.add(new Student("S001", "李四")); // 学号相同 → 被视为重复,add 返回 false,不加入
System.out.println(set.size()); // 输出 1
</student>
只要 equals 和 hashCode 正确,泛型 + HashSet 就能自动拦截重复项,无需额外循环或判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











