在 Java 中,Set 是一种不包含重复元素的集合(继承自 Collection),其核心特点是:无序(除特定实现外)、不可重复、最多一个 null(部分实现)。
下面从适用场景和常见实现对比两个方面说明。
当你**不关心顺序,只关心“是否存在”或“是否重复”**时:
Set<String> set = new HashSet<>();
set.add("a");
set.add("a"); // 自动去重
✅ 适用:
Set 的 contains() 时间复杂度:
HashSet:O(1)TreeSet:O(log n)比 List 的 contains()(O(n))快得多。
if (set.contains(userId)) {
// 已存在
}
✅ 适用:
Set 天生适合集合操作:
set1.retainAll(set2); // 交集
set1.removeAll(set2); // 差集
set1.addAll(set2); // 并集
✅ 适用:
使用 TreeSet:
Set<Integer> set = new TreeSet<>();
✅ 适用:
使用:
ConcurrentHashMap.newKeySet()Collections.synchronizedSet()✅ 适用:
| 实现类 | 是否有序 | 是否线程安全 | 特点 | 适用场景 |
|---|---|---|---|---|
| HashSet | ❌ | ❌ | 最快、最常用 | 通用去重 |
| LinkedHashSet | ✅(插入顺序) | ❌ | 保留顺序 | 需要顺序的去重 |
| TreeSet | ✅(自然/定制排序) | ❌ | 红黑树 | 排序 + 去重 |
| ConcurrentHashMap.KeySetView | ❌ | ✅ | 并发安全 | 多线程环境 |
只要你不关心顺序、不想要重复、只关心“有没有”,就用 Set。
如果你有具体业务场景(如缓存、权限、去重、并发),我可以帮你选最合适的 Set 实现。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。