温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Set怎样去重最快

发布时间:2026-10-25 19:27:28 来源:亿速云 阅读:84 作者:小樊 栏目:编程语言

在 Java 中,“Set 去重最快”取决于数据规模、数据类型和是否可修改原数据。下面从原理 + 实践角度说明。


一、最快的通用做法(推荐)

✅ 使用 HashSet(最常见、最快)

List<String> list = ...;
Set<String> set = new HashSet<>(list);
List<String> result = new ArrayList<>(set);

为什么快?

  • 基于 哈希表
  • 插入 / 查询平均时间复杂度:O(1)
  • 适合:
    • String、Integer、Long 等
    • 自定义对象(需正确重写 equals + hashCode)

✅ 90% 场景选它


二、保持顺序去重(次快)

✅ LinkedHashSet

Set<String> set = new LinkedHashSet<>(list);
  • 去重速度:⚡ 接近 HashSet
  • 额外维护插入顺序
  • 适合:
    • 需要“去重且保留原顺序”

三、需要排序去重

✅ TreeSet

Set<String> set = new TreeSet<>(list);
  • 时间复杂度:O(log n)
  • 自动排序
  • 比 HashSet 慢
  • 适合:
    • 去重 + 排序一起做

四、Java 8+ 流式去重(代码简洁)

List<String> result = list.stream()
    .distinct()
    .collect(Collectors.toList());
  • 底层仍是 LinkedHashSet 思路
  • 可读性高
  • 性能略低于直接 HashSet

五、超大并发数据(多线程)

✅ ConcurrentHashMap 去重(最快并发)

Set<String> set = ConcurrentHashMap.newKeySet();
  • 高并发安全
  • 比 Collections.synchronizedSet 快很多

六、性能对比(大致)

方式 速度 是否保序 说明
HashSet ⭐⭐⭐⭐⭐ 否 最快
LinkedHashSet ⭐⭐⭐⭐ 是 推荐
TreeSet ⭐⭐⭐ 排序 较慢
stream.distinct ⭐⭐⭐⭐ 是 简洁

七、自定义对象去重要点(很重要)

@Override
public boolean equals(Object o) { ... }

@Override
public int hashCode() { ... }

否则 HashSet 去重失效!


✅ 总结一句话

最快去重:用 HashSet;要保序用 LinkedHashSet;并发用 ConcurrentHashMap.newKeySet()。

如果你有:

  • 数据量(10万 / 1000万)
  • 是否对象
  • 是否并发

我可以给你具体最优方案 + 性能测试示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手