0

0

TreeSet和HashSet怎么选_Java中需要元素自动排序的Set集合

P粉602998670

P粉602998670

发布时间:2026-03-16 13:24:01

|

648人浏览过

|

来源于php中文网

原创

TreeSet 保证有序但需实现 Comparable 或传 Comparator,底层红黑树;HashSet 查插快但无序,底层哈希表;选型需据排序需求、顺序要求、并发场景综合判断。

treeset和hashset怎么选_java中需要元素自动排序的set集合

TreeSet 保证有序,但得实现 Comparable 或传 Comparator

TreeSet 内部用红黑树实现,插入、查找、遍历天然按元素自然顺序(或自定义顺序)排列。但前提是元素类型必须能比较大小——要么实现 Comparable 接口(比如 StringInteger),要么构造时显式传入 Comparator

常见错误现象:ClassCastException,比如往空 TreeSet 里加 new Object() 或没实现 Comparable 的自定义类;或者用 lambda 写 Comparator 时返回值不是 int(比如写了 return a.name > b.name 这种布尔表达式)。

  • 如果业务逻辑强依赖「每次遍历都升序」,且元素类型天然可比(如时间戳、编号),优先选 TreeSet
  • 若需按非自然字段排序(比如按用户昵称长度),用 new TreeSet(Comparator.comparingInt(u -> u.getName().length()))
  • 注意:TreeSet 不允许 null 元素(除非用自定义 Comparator 显式处理 null

HashSet 查得快、插得快,但顺序完全不保证

HashSet 底层是哈希表,平均时间复杂度 O(1),但不维护任何顺序——你 add 的顺序、迭代出来的顺序、甚至两次运行的顺序都可能不同。JDK 8 后内部用了红黑树优化链表过长的情况,但对外仍不承诺顺序。

常见错误现象:本地测试时遍历结果“看起来有序”,上线后逻辑出错;或者误以为 HashSet 能替代 LinkedHashSet 来保插入顺序。

立即学习Java免费学习笔记(深入)”;

  • 只关心“去重”和“快速查存”,不依赖顺序 → 无脑选 HashSet
  • 需要保持插入顺序?换 LinkedHashSet,它多一个双向链表,开销略增但顺序稳定
  • 元素是自定义类?务必重写 hashCode()equals(),否则 add() 可能重复、contains() 返回 false

性能差距在数据量大时才明显,小集合别纠结

100 个元素以内,TreeSetHashSet 的实际耗时差异几乎感知不到。真正拉开差距的是操作频率和数据规模:

OpenJobs AI
OpenJobs AI

AI驱动的职位搜索推荐平台

下载
  • HashSet:单次 add/contains 平均 O(1),最坏 O(n)(哈希冲突严重时)
  • TreeSet:单次 add/contains 稳定 O(log n),n=100 时约 7 次比较,n=10000 时约 14 次
  • 遍历 TreeSet 是 O(n),但自带排序;遍历 HashSet 也是 O(n),但得额外 Arrays.sort() 才能有序,总成本更高

所以别一上来就压测,先想清楚:你是不是真的每秒要跑几万次 add/contains?还是只是初始化一次、后续只读遍历?

别忽略内存和线程安全的隐性成本

TreeSet 每个节点要存左右子节点引用,比 HashSet 的哈希桶节点更占内存;而 HashSet 在扩容时会触发数组复制,可能引发短暂停顿。

两者都不支持并发修改:多线程环境下直接用会抛 ConcurrentModificationException

  • 需要线程安全的有序 Set?用 Collections.synchronizedSortedSet(new TreeSet()),但注意迭代时仍需手动同步
  • 高并发场景更推荐 ConcurrentSkipListSet(基于跳表,支持并发且有序),但它不接受 null,且 comparator 必须能处理所有元素
  • 如果只是偶尔写、频繁读,考虑用不可变集合(如 ImmutableSortedSet from Guava)避免锁开销

排序需求看着简单,但 Comparable 的 null 处理、Comparator 的稳定性、并发下的可见性——这些地方一漏,问题往往出现在压测后期或流量高峰时。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

271

2024.05.29

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

255

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1132

2024.03.01

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

410

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

617

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号