当前位置: 首页 > news >正文

【JAVA】TreeSet讲解

什么是TreeSet?TreeSet是JAVA中集合的一种,它通过红黑树(Red-Black Tree)数据结构实现了有序的,唯一元素存储结构。

一、TreeSet的定义

TreeSet是Java集合框架中的一种有序集合,它实现了Set接口,因此具有不允许重复元素的特性。TreeSet 使用红黑树数据结构来存储元素,这使得元素在集合中保持有序。
这里需要理解两个主要特性:

  • 有序性(Order):TreeSet中的元素按照自然排序(元素的自然顺序)或者指定的排序方式(通过比较器)排列。这意味着您可以遍历TreeSet 得到的元素是按照一定的顺序排列的。
  • 唯一性(Uniqueness):TreeSet保证元素的唯一性,不允许重复元素。
    因此,TreeSet是一个适用于需要有序存储唯一元素的场景的理想选择。

二、TreeSet的实现

要深入理解TreeSet,我们需要了解它的内部实现机制,即红黑树。红黑树是一种自平衡二叉搜索树(Self-Balancing Binary Search Tree),它具有以下特性:

  • 每个节点要么是红色,要么是黑色。
  • 根节点是黑色。
  • 每个叶子节点(NIL节点,空节点)是黑色的。
  • 如果一个节点是红色的,则它的两个子节点都是黑色的。

从任意节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。
这些规则确保了树的平衡,从而保证了树的高度不会过高,使得查找、插入和删除操作的性能稳定。
在TreeSet中,元素被存储在红黑树的节点中,根据元素的大小关系构建树结构。这意味着,插入、删除和查找操作的时间复杂度为O(log n),其中n是集合中的元素个数。由于红黑树的平衡性质,这些操作的性能是可预测的。

三、TreeSet的基本使用

前置导入

import java.util.TreeSet;

1 TreeSet的创建和初始化

1.1 默认构造方法

TreeSet的默认构造方法,元素默认按照升序排列。

public static void main(String[] args) {TreeSet<Integer> t = new TreeSet<>();t.add(3);t.add(2);t.add(1);System.out.println(t);// 运行结果:[1, 2, 3]
}

1.2 制定排序方式的构造方法

可以使用带有Comparator参数的构造函数来指定元素的排序方式。
例如:构造一个降序排列的TreeSet:

public static void main(String[] args) {TreeSet<Integer> t = new TreeSet<>(Comparator.reverseOrder());t.add(2);t.add(1);t.add(3);System.out.println(t);// 运行结果:[3, 2, 1]
}

1.3 从现有集合中创建

从一个List或者Set中创建TreeSet:

public static void main(String[] args) {Set<Integer> s = new HashSet<>(Arrays.asList(2, 1, 3));TreeSet<Integer> t = new TreeSet<>(s);System.out.println(t);// 运行结果:[1, 2, 3]
}
http://www.jsqmd.com/news/457/

相关文章:

  • 攻防世界 web
  • 批判 vs 审判
  • XXL-JOB-源码分享(1)
  • ctfshow web入门 SSRF
  • C#中避免GC压力和提高性能的8种技术
  • UNIX网络编程笔记:共享内存区和远程过程调用 - 指南
  • 基于OpenCv做照片分析应用一(Java) - 指南
  • 函数内联
  • 7. Innodb底层原理与Mysql日志机制深入剖析
  • WPF 字符竖向排列的排版格式(直排)表明控件
  • 新建Vue3项目流程
  • G. Chimpanzini Bananini
  • 深入解析:HSA35NV001美光固态闪存NQ482NQ470
  • ERP和MES、WMS、CRM,到底怎么配合 - 智慧园区
  • YOLO实战应用 1YOLOv5 架构与模块
  • YOLO实战应用 2数据准备与增强
  • Day18稀疏数组
  • 底层
  • YOLO实战应用 3训练与优化策略
  • WPF 视图缩略图控件(支持缩放调节与拖拽定位)
  • 实用指南:Dify关联Ollama
  • ik中文分词器使用
  • 动态水印也能去除?ProPainter一键视频抠图整合包下载
  • SpringBoot整合RustFS:全方位优化文件上传性能
  • javaScript(WebAPI) - 教程
  • windows使用es-client插件
  • AI学习日记 - 实践
  • es中的端点
  • 解码C语言宏
  • es中的索引