Set 集合的性能优化,核心在于选对实现、控制容量、减少哈希冲突、减少不必要的对象创建。下面从 Java 示例 出发,系统讲一下优化思路(其他语言如 Python / C++ 思路类似)。
| Set 类型 | 底层结构 | 是否有序 | 适用场景 |
|---|---|---|---|
| HashSet | 哈希表 | 无序 | ✅ 普通去重、查找 |
| LinkedHashSet | 哈希表 + 链表 | 插入顺序 | 需要顺序 |
| TreeSet | 红黑树 | 自然 / 自定义排序 | 需要排序 |
| EnumSet | 位向量 | 枚举顺序 | ✅ 枚举值集合 |
✅ 99% 的优化第一步:能用 HashSet 就用 HashSet
Set<Integer> set = new HashSet<>(); // 最快
TreeSet 查找是 O(log n),HashSet 是 O(1)。
HashSet 默认容量小,数据多时会频繁 扩容 + rehash,代价很高。
提前估算元素数量:
Set<String> set = new HashSet<>(1024);
更精确(避免扩容):
int expectedSize = 1000;
Set<String> set = new HashSet<>((int)(expectedSize / 0.75f) + 1);
✅ 原则:容量 ≈ expectedSize / loadFactor
❌ 不好:
@Override
public int hashCode() {
return 1; // 所有对象冲突
}
✅ 好:
@Override
public int hashCode() {
return Objects.hash(id, name);
}
❌ 不好:
Set<Integer> set = new HashSet<>();
for (int i = 0; i < 1000000; i++) {
set.add(i); // 自动装箱
}
✅ 如果数据范围小,考虑:
BitSet set = new BitSet();
set.set(i);
// 避免频繁 new
private static final Set<String> CACHE = Set.of("a", "b", "c");
set.addAll(list);
优于:
for (String s : list) {
set.add(s);
}
❌ 不推荐:
synchronized (set) {
set.add(x);
}
✅ 推荐:
Set<String> set = ConcurrentHashMap.newKeySet();
或:
Set<String> set = Collections.newSetFromMap(new ConcurrentHashMap<>());
Set<Day> set = EnumSet.of(MONDAY, FRIDAY);
| 优化点 | 效果 |
|---|---|
| 用 HashSet | ⭐⭐⭐⭐ |
| 预设置容量 | ⭐⭐⭐⭐ |
| 优化 hashCode | ⭐⭐⭐ |
| 减少对象创建 | ⭐⭐⭐ |
| 并发用 ConcurrentHashMap | ⭐⭐⭐⭐ |
Set 性能优化的本质:减少哈希冲突 + 减少扩容 + 减少对象创建 + 选对数据结构。
如果你有具体场景(如:百万级去重、高并发、占用内存大、Java / Python / C++),可以贴出来,我可以给你针对性优化方案 + 代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。