优先选HashSet实现快速去重,时间复杂度O(1),适合幂等校验等场景;需排序则选TreeSet,基于红黑树实现O(log n)有序操作;小数据量差异不明显,大数据量HashSet优势显著。

选 HashSet 还是 TreeSet,关键看你要不要排序,以及对性能和元素类型有没有硬性要求。
需要快速去重、不关心顺序 → 用 HashSet
它底层是 HashMap,所有操作(add、remove、contains)平均都是 O(1)。适合高频判重场景,比如接口幂等校验、IP 白名单、订单号缓存。
- 元素可以是 null(只允许一个)
- 必须保证对象正确重写 hashCode() 和 equals(),否则去重失效
- 迭代顺序不固定,扩容后可能变化,不能依赖遍历顺序
需要自动升序/降序,且元素可比较 → 用 TreeSet
它底层是红黑树,插入、查找、删除都是 O(log n),但天然有序。遍历结果永远按自然顺序(如 Integer、String)或你指定的 Comparator 排好。
- 不能存 null(除非自定义 Comparator 显式支持)
- 元素必须实现 Comparable,或构造时传入 Comparator
- 支持 first()、last()、headSet()、subSet() 等有序操作,HashSet 没有
其他影响因素也要注意
如果数据量小(比如几十个元素),两者性能差异几乎感觉不到;但如果数据量上万,HashSet 的常数级速度优势就很明显。
- 想保持插入顺序?选 LinkedHashSet,不是 HashSet 也不是 TreeSet
- 处理枚举类型?EnumSet 效率更高,位运算实现,比 HashSet 还快
- 多线程环境?HashSet 和 TreeSet 都不安全,得用 Collections.synchronizedSet 或 ConcurrentSkipListSet
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











