hashset高效去重因其基于哈希表实现,平均时间复杂度o(1),依赖hashcode()定位桶、equals()确认相等;自定义类必须同时重写二者,string等内置类型可直接使用,需保序则用linkedhashset或stream.collect(tocollection(linkedhashset::new))。

HashSet 是 Java 中最常用、最高效的去重工具之一,核心在于它基于哈希表实现,平均时间复杂度为 O(1) 的添加和查找操作。只要元素正确重写 equals() 和 hashCode(),就能稳定、快速地完成列表去重。
为什么 HashSet 能高效去重?
HashSet 底层使用 HashMap(JDK 8+ 是数组 + 链表/红黑树),判断重复依赖两个条件:
- 两个对象的
hashCode()值相等(决定是否落在同一个桶里) - 在同一个桶中,再用
equals()比较内容是否真正相等
所以,自定义类去重时,必须同时重写 equals() 和 hashCode(),否则可能把本应相等的对象当成不同元素,导致去重失败。
基础类型或 String 列表去重(开箱即用)
String、Integer 等 JDK 内置类已自带规范的 equals() 和 hashCode(),直接用即可:
List<string> list = Arrays.asList("a", "b", "a", "c");
Set<string> uniqueSet = new HashSet(list);
List<string> uniqueList = new ArrayList(uniqueSet); // 顺序不保证
</string></string></string>
注意:HashSet 不保证插入顺序。如需保持原顺序,改用 LinkedHashSet:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Set<string> uniqueSet = new LinkedHashSet(list); // 按首次出现顺序保留 </string>
自定义对象去重(关键在重写两个方法)
例如有个 User 类,按 id 去重:
public class User {
private Long id;
private String name;
public User(Long id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id); // 只看 id 是否相同
}
@Override
public int hashCode() {
return Objects.hash(id); // 必须和 equals 逻辑一致
}
}
之后即可正常使用:
List<user> users = Arrays.asList(
new User(1L, "Alice"),
new User(2L, "Bob"),
new User(1L, "Alicia") // id 相同,会被去重
);
Set<user> uniqueUsers = new HashSet(users);
</user></user>
一行流式去重(Java 8+ 推荐)
结合 Stream API,代码更简洁,且可选是否保留顺序:
// 不保证顺序(底层用 HashSet)
List<string> unique = list.stream().distinct().collect(Collectors.toList());
// 保证首次出现顺序(底层用 LinkedHashSet)
List<string> uniqueOrdered = list.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new LinkedHashSet()),
ArrayList::new
));
</string></string>
注意:Stream.distinct() 也依赖元素的 equals() 和 hashCode(),原理和 HashSet 完全一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










