java中利用hashset去重,核心在于其底层依赖元素的equals()和hashcode()方法。将list转为set时,只需传入list实例即可自动过滤重复项;若需对自定义对象去重,必须重写这两个方法以确保逻辑一致。

List转Set去重的具体实现
直接调用new HashSet(list)即可完成转换与去重。该方法会遍历列表中的每个元素,计算哈希值并放入桶中,遇到已存在的键则跳过。此过程时间复杂度为O(n),且能保留原集合的元素类型。

import java.util.*;
public class Main {
public static void main(String[] args) {
List<string> list = Arrays.asList("A", "B", "A", "C", "B");
Set<string> set = new HashSet(list);
System.out.println(set); // [A, B, C]
}
}</string></string>
自定义对象去重的条件
对于自定义类,必须同时重写equals()和hashCode()。如果只重写其中一个,会导致逻辑冲突:例如两个对象equals()相等但hashCode()不同,它们会被放入不同的桶中,从而无法被识别为重复项。

import java.util.*;
class User {
String name;
int id;
User(String n, int i) { name = n; id = i; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User u = (User) o;
return id == u.id && Objects.equals(name, u.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
public class Main {
public static void main(String[] args) {
List<user> users = Arrays.asList(
new User("Alice", 1),
new User("Bob", 2),
new User("Alice", 1)
);
Set<user> uniqueUsers = new HashSet(users);
System.out.println(uniqueUsers.size()); // 2
}
}</user></user>
基于输入结果的具体问题
当输入包含null值时,HashSet允许存在一个null元素。在List转Set的过程中,所有null都会被合并为一个。这是由HashMap(HashSet的底层实现)处理null键的逻辑决定的,即null总是映射到哈希表的第一个桶位。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











