在 Java 中,Set 本身就是用来去除重复元素的集合,其核心特性是:不允许存储重复元素。下面从「使用方式」和「去重原理」两个角度说明。
List<String> list = Arrays.asList("a", "b", "a", "c", "b");
Set<String> set = new HashSet<>(list);
System.out.println(set); // [a, b, c]
✅ 利用 HashSet 的构造方法即可自动去重。
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(1); // 不会生效
System.out.println(set); // [1, 2]
| 实现类 | 是否去重 | 是否有序 | 说明 |
|---|---|---|---|
| HashSet | ✅ | ❌ | 最常用,性能最好 |
| LinkedHashSet | ✅ | ✅ | 保持插入顺序 |
| TreeSet | ✅ | ✅ | 按自然顺序或 Comparator 排序 |
List<String> list = Arrays.asList("b", "a", "b", "c");
Set<String> set = new LinkedHashSet<>(list);
System.out.println(set); // [b, a, c]
⚠️ Set 去重依赖 equals() 和 hashCode()
class User {
String name;
}
Set<User> set = new HashSet<>();
set.add(new User("Tom"));
set.add(new User("Tom")); // 认为是不同对象
class User {
String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
return Objects.equals(name, ((User) o).name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
Set<User> set = new HashSet<>();
set.add(new User("Tom"));
set.add(new User("Tom")); // 去重成功
List<String> list = Arrays.asList("a", "b", "a");
List<String> result = list.stream()
.distinct()
.collect(Collectors.toList());
✅ Set 去重的核心:
equals() 和 hashCode()LinkedHashSetTreeSet如果你有 具体场景(如对象去重、性能要求、并发环境),可以告诉我,我可以给你更合适的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。