TreeSet
是 Java 中一个基于红黑树实现的有序集合,它继承自 AbstractSet
并实现了 NavigableSet
接口。TreeSet
中的元素按照自然顺序或通过提供的 Comparator
进行排序,确保元素处于排序状态。它支持快速的插入、删除、查找和范围查询操作,具有对数时间复杂度。TreeSet
是非线程安全的,适用于需要有序集合的场景,如需要排序的数据集、范围查询和有序迭代。
肖哥弹架构 跟大家“弹弹” 高并发锁, 关注公号回复 'mvcc' 获得手写数据库事务代码
欢迎 点赞,关注,评论。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- 解锁大语言模型参数:零基础掌握大型语言模型参数奥秘与实践指南
- 高性能连接池之HikariCP框架分析:高性能逐条分解(架构师篇)
- 缓存雪崩/穿透/击穿/失效原理图/14种缓存数据特征+10种数据一致性方案
- Java 8函数式编程全攻略:43种函数式业务代码实战案例解析(收藏版)
- 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
- 17个Mybatis Plugs注解:Mybatis Plugs插件架构设计与注解案例(必须收藏)
1、 TreeSet
TreeSet
是 Java 集合框架中的一个有序集合类,实现了 Set
接口。以下是 TreeSet
的设计:
设计思考:
-
需求场景:
- 在许多编程任务中,需要存储不重复的元素,并且这些元素需要保持一定的顺序,例如,自然排序或自定义排序顺序。
- 例如,在处理需要排序的配置选项、用户权限、需要按顺序处理的任务列表等场景时,元素的排序顺序是非常重要的。
-
现有技术局限性:
-
HashSet
提供了非常快的查找、添加和删除操作,但它不保证元素的任何特定顺序。 -
ArrayList
和LinkedList
可以保持插入顺序,但查找操作需要线性时间。
-
-
技术融合:
-
TreeSet
结合了HashSet
的快速查找特性和ArrayList
/LinkedList
的元素顺序保持功能,但通过使用红黑树(一种自平衡的二叉搜索树)实现,提供了有序的元素集合。
-
-
设计理念:
-
TreeSet
提供了一个不允许重复元素的数据结构,同时保证了元素处于排序状态,可以进行有效的范围查询和排序操作。
-
-
实现方式:
-
TreeSet
内部使用TreeMap
的实例来存储元素,其中元素作为键,值是一个固定的虚拟对象(如PRESENT
),从而保证了元素的唯一性。
-
2、 数据结构
图说明:
-
TreeSet:
- 表示
TreeSet
类的实例,它实现了Set
接口,并保证元素处于排序状态。
- 表示
-
TreeMap:
-
TreeSet
基于TreeMap
实现,其中元素作为键存储,而不关心值。
-
-
红黑树:
-
TreeMap
的底层数据结构是一个红黑树,它是一个自平衡的二叉搜索树。
-
-
根节点:
- 红黑树的根节点,是树的入口。
-
左子节点和右子节点:
- 表示红黑树节点的子节点。
-
元素A, 元素B, 元素C:
- 实际存储在
TreeSet
中的数据。
- 实际存储在
3、 执行流程
图说明:
-
添加元素:
- 计算元素的自然排序:根据元素的自然顺序或提供的 Comparator 计算排序。
- 构建红黑树:TreeSet 基于红黑树数据结构,确保元素处于排序状态。
- 确定插入位置:在红黑树中找到元素的插入位置。
- 插入元素到红黑树:将元素插入到红黑树中。
-
删除元素:
- 计算元素的自然排序:根据元素的自然顺序或提供的 Comparator 计算排序。
- 查找红黑树:在红黑树中查找要删除的元素。
- 删除元素从红黑树:从红黑树中删除元素。
-
遍历 TreeSet:
- 获取红黑树根节点:获取红黑树的根节点,开始遍历。
- 遍历红黑树节点:遍历红黑树的每个节点。
- 读取元素:从红黑树的节点中读取元素。
4、优点:
-
有序性:
- 元素会根据其自然顺序或构造时提供的
Comparator
进行排序。
- 元素会根据其自然顺序或构造时提供的
-
快速查找:
- 提供了对数时间复杂度的查找性能。
-
元素唯一性:
- 自动处理元素的唯一性,避免了重复元素的问题。
-
范围查询:
- 可以方便地进行范围查询和获取子集。
5、缺点:
-
性能开销:
- 相比于
HashSet
,TreeSet
在添加、删除和查找操作上有更高的性能开销。
- 相比于
-
内存消耗:
- 相比于
HashSet
,TreeSet
可能需要更多的内存来存储红黑树结构。
- 相比于
-
数据实时性:
- 由于排序操作的开销,
TreeSet
在数据更新时可能不如HashSet
快。
- 由于排序操作的开销,
6、使用场景:
- 需要保持元素排序顺序的场景,如排序的配置列表、按顺序执行的任务调度等。
7、类设计
8、应用案例
TreeSet
通常用于需要保持元素有序的集合。这是一个简单的图书管理系统,用于存储图书的ISBN号,并保持它们有序:
import java.util.TreeSet;
// 图书类,用于表示图书的ISBN号
class Book {
private String isbn;
public Book(String isbn) {
this.isbn = isbn;
}
public String getIsbn() {
return isbn;
}
@Override
public String toString() {
return "ISBN: " + isbn;
}
}
// 图书管理系统类
class BookManager {
private TreeSet<String> isbnSet;
public BookManager() {
isbnSet = new TreeSet<>();
}
// 添加图书到系统
public void addBook(String isbn) {
isbnSet.add(isbn);
}
// 获取所有图书的ISBN号
public TreeSet<String> getIsbnSet() {
return isbnSet;
}
public static void main(String[] args) {
BookManager bookManager = new BookManager();
// 添加图书到系统
bookManager.addBook("978-3-16-148410-0");
bookManager.addBook("978-1-4028-9462-6");
bookManager.addBook("978-0-596-52068-7");
// 获取并打印所有图书的ISBN号
TreeSet<String> isbnSet = bookManager.getIsbnSet();
for (String isbn : isbnSet) {
System.out.println(isbn);
}
}
}