java hashset 在业务去重场景的核心用法是依赖对象的 equals() 和 hashcode() 方法实现 o(1) 时间复杂度的快速查找与插入。具体做法是将需要去重的对象实例直接添加到 hashset 中,若集合中已存在逻辑上相等的元素(即 equals() 返回 true),则新元素会被自动忽略,从而保证集合内元素的唯一性。

HashSet 如何判定两个对象是否重复
HashSet 通过哈希表结构进行去重,判定过程分为两步:首先计算对象的 hashCode() 值以确定桶位置,若该位置已有元素,则进一步调用 equals() 方法进行逐字段比对。只有当 hashCode() 相同且 equals() 返回 true 时,系统才认定这两个对象重复。因此,在自定义类中必须同时重写这两个方法,否则默认使用内存地址进行比较,导致业务逻辑上的重复对象被误判为不同元素。

import java.util.HashSet;
import java.util.Objects;
public class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
public static void main(String[] args) {
HashSet<user> set = new HashSet();
set.add(new User("001", "Alice"));
set.add(new User("001", "Bob")); // 逻辑重复,不会添加
System.out.println(set.size()); // 输出 1
}
}</user>
如何处理 HashSet 中的空值与不可变字段
在使用 HashSet 时,必须确保作为键值的对象字段是不可变的,或者在放入集合后不再修改参与 equals() 比较的字段。如果对象在加入集合后被修改了 hashCode() 相关的属性,会导致哈希冲突或无法正确检索。此外,HashSet 允许存储一个 null 值,因为 null 的哈希码被特殊处理为 0,但多次添加 null 只会保留一个实例。

import java.util.HashSet;
import java.util.Objects;
public class Product {
private final String sku;
private String status;
public Product(String sku) {
this.sku = sku;
this.status = "active";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Product)) return false;
Product product = (Product) o;
return Objects.equals(sku, product.sku);
}
@Override
public int hashCode() {
return Objects.hash(sku);
}
public static void main(String[] args) {
HashSet<product> products = new HashSet();
products.add(null); // 允许添加 null
products.add(null); // 再次添加 null,被忽略
products.add(new Product("P100"));
// 尝试修改状态,不影响去重逻辑
products.iterator().next().setStatus("inactive");
System.out.println(products.size()); // 输出 2
}
public void setStatus(String status) {
this.status = status;
}
}</product>
基于 HashSet 过滤列表中的重复项
在实际业务中,通常需要将一个包含重复数据的 List 转换为无重复的集合。最直接的做法是构造一个新的 HashSet 并传入原列表,利用构造函数内部的迭代添加机制完成去重。这种方式比手动遍历判断更高效,且能保持插入顺序的稳定性(如果使用 LinkedHashSet)。对于基本类型数组,需先包装为对象或使用 Stream API 配合 Collectors.toSet() 来实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











