深入理解Java TreeSet:实现与使用案例分析

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java中,有很多常用的数据结构,例如List、Set、Map等,这些数据结构都是为了方便程序员的数据管理而存在的。而TreeSet作为Set的一种实现方式,它的底层实现是基于红黑树的。

摘要

  本文将对Java中的TreeSet进行详细介绍,包括其底层实现原理、应用场景案例、优缺点分析、类代码方法介绍、以及测试用例等内容,旨在帮助读者更好地了解和使用TreeSet。

TreeSet类

简介

  TreeSet是Java中的一个基于红黑树实现的有序集合,它实现了NavigableSet接口和SortedSet接口。与HashSet不同,TreeSet中的元素是有序的,且不允许存在重复元素。在TreeSet中,元素按照指定顺序进行存储,并且可以在O(log(n))时间复杂度内实现插入、查找、删除等操作。TreeSet可以对元素进行自然排序或者指定排序方式。

源代码解析

  TreeSet的底层实现是基于红黑树的,红黑树是一种自平衡的二叉搜索树。红黑树的每个节点都具有一个颜色属性,为红色或黑色。在插入与删除节点的过程中,通过改变颜色和旋转节点来保持红黑树的平衡。红黑树的所有操作都可以在O(log(n))时间复杂度内完成。

  TreeSet中的add()方法实现了对元素的插入操作,它首先调用红黑树的插入方法,在插入节点时会进行颜色调整和旋转操作,保持红黑树的平衡性。TreeSet中的remove()方法实现了对元素的删除操作,也会进行颜色调整和旋转操作来保持红黑树的平衡。

  如下是Java TreeSet 是一种基于红黑树实现的集合,具有以下特点:

1.元素自动排序:TreeSet 中的元素会自动按照其自然顺序进行排序;或者按照构造 TreeSet 时传入的 Comparator 进行排序。

  1. 线程不安全:TreeSet 并不是线程安全的。

  2. 支持高效的插入、删除、查找操作:由于底层是基于红黑树实现,因此这些操作的时间复杂度为 O(logN)。

下面,我们来看一下 TreeSet 的源代码实现。

  1. 数据结构

TreeSet 的底层实现是一个基于 TreeMap 的映射,其中键就是 TreeSet 中的元素,值则是一个固定的 Object 对象。因为 TreeMap 是基于红黑树实现的,所以 TreeSet 中的元素也具有自动排序的特点。

  1. 构造函数

TreeSet 有多个构造函数,其中最常用的是无参构造函数和一个 Comparator 类型的参数构造函数。

无参构造函数:

public TreeSet() {this(new TreeMap<>());
}

该构造函数会新建一个基于 TreeMap 的映射。

带 Comparator 参数的构造函数:

public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));
}

该构造函数会新建一个基于 TreeMap 的映射,并且使用传入的 Comparator 进行元素排序。

  1. 插入元素

TreeSet 的插入元素操作是基于 TreeMap 的 put() 方法实现的,具体实现代码如下:

public boolean add(E e) {return m.put(e, PRESENT)==null;
}

其中,PRESENT 是一个固定的 Object 对象,用于作为 TreeMap 的 value。

当插入一个新元素时,如果 TreeMap 中已经存在相同的元素,则会更新该元素的 value 值,并且返回 false;否则,将新元素插入到 TreeMap 中,并且返回 true。

  1. 删除元素

TreeSet 的删除元素操作也是基于 TreeMap 的 remove() 方法实现的,具体实现代码如下:

public boolean remove(Object o) {return m.remove(o)==PRESENT;
}

该方法会将 TreeMap 中键为 o 的元素删除,并且返回该元素对应的 value 值。如果该 value 值为 PRESENT,则表示 TreeMap 中原来确实存在这个元素,删除该元素成功,并且返回 true;否则返回 false。

  1. 遍历元素

TreeSet 提供了多种遍历元素的方式,包括迭代器、forEach() 方法等。其中, 迭代器遍历的顺序是按照元素的自然顺序或者 Comparator 的顺序进行的。

源代码部分截图:

在这里插入图片描述

  总之,Java TreeSet 是一个基于红黑树实现的集合,具有元素自动排序、线程不安全、支持高效的插入、删除、查找等操作的特点。在实现过程中,TreeSet 底层是基于 TreeMap 进行数据存储与操作的。如果需要存储有序的元素,或者进行快速的插入、删除、查找等操作,可以使用 Java TreeSet。

应用场景案例

  TreeSet的有序性和快速查找的特点使得它在很多场景下都可以发挥重要作用,例如:

  1. 排序数据:TreeSet可以对元素进行自然排序或者指定排序方式,因此可以非常方便地对数据进行排序操作。
  2. 去重数据:TreeSet中不允许存在重复元素,因此可以用来去重。
  3. 优先级队列:TreeSet可以实现一个优先级队列,在优先级队列中,元素按照指定顺序进行存储,并且可以在O(log(n))时间复杂度内实现插入、查找、删除等操作。

优缺点分析

TreeSet作为一种基于红黑树实现的有序集合,具有以下优缺点:

优点

  1. 元素有序:TreeSet中的元素是有序的,可以进行自然排序或者指定排序方式。
  2. 快速查找:在TreeSet中进行查找操作的时间复杂度为O(log(n)),因此查找速度非常快。
  3. 去重数据:TreeSet中不允许存在重复元素,可以用来去重。

缺点

  1. 空间开销大:TreeSet的底层实现是基于红黑树的,因此需要额外的空间存储树的结构,导致空间开销较大。
  2. 插入、删除操作慢:虽然在TreeSet中进行查找操作的时间复杂度为O(log(n)),但是插入、删除操作的时间复杂度也是O(log(n)),因此在频繁进行插入、删除操作时,性能可能不如HashSet等数据结构。

类代码方法介绍

方法一:add()

public boolean add(E e)

方法说明:

向TreeSet中添加一个元素。

参数说明:

  • e:要添加的元素。

返回值:

  • 如果插入成功返回true,否则返回false。

方法二:remove()

public boolean remove(Object o)

方法说明:

TreeSet中删除指定元素。

参数说明:

  • o:要删除的元素。

返回值:

  • 如果删除成功返回true,否则返回false。

方法三:iterator()

public Iterator<E> iterator()

方法说明:

返回一个迭代器,用于遍历TreeSet中的元素。

返回值:

  • 返回一个迭代器,用于遍历TreeSet中的元素。

测试用例

用例代码

如下通过使用TreeSet来给大家做个演示:代码如下:

package com.example.javase.collection;import java.util.Iterator;
import java.util.TreeSet;/*** @Author ms* @Date 2023-10-24 21:23*/
public class TreeSetTest {public static void main(String[] args) {TreeSet<String> set = new TreeSet<>();// 添加元素set.add("apple");set.add("banana");set.add("orange");set.add("pear");set.add("grape");set.add("watermelon");// 输出元素System.out.println("TreeSet中的元素为:");Iterator<String> iterator = set.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}System.out.println();// 删除元素set.remove("orange");// 输出元素System.out.println("删除元素后,TreeSet中的元素为:");iterator = set.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}System.out.println();}
}

测试结果

输出结果:

TreeSet中的元素为:
apple banana grape orange pear watermelon 
删除元素后,TreeSet中的元素为:
apple banana grape pear watermelon 

结果截图如下:

在这里插入图片描述

测试代码分析

  这段代码演示了如何使用Java中的TreeSet类,实现了向集合中添加元素、输出元素、删除元素等基本操作。

  首先,创建了一个String类型的TreeSet对象set,并向其中添加了多个元素,即"apple"、“banana”、“orange”、“pear”、“grape”、“watermelon”。

  然后,利用迭代器遍历输出set中的元素,其中利用了hasNext()next()方法。

  接着,从set中删除了一个元素"orange"。

  最后,再次利用迭代器遍历输出set中的元素,查看删除操作是否生效。

全文小结

  本文主要介绍了Java中的TreeSet,包括其底层实现原理、应用场景案例、优缺点分析、方法介绍以及测试用例等内容。通过本文的阅读,读者可以更好地了解并使用TreeSet。

总结

  本文主要介绍了Java中的TreeSet类,包括其底层实现原理、应用场景案例、优缺点分析、方法介绍以及测试用例等内容。通过本文的介绍,我们了解到TreeSet是一种基于红黑树实现的有序集合,具有元素有序、快速查找、去重数据等优点,可以应用到很多场景中。但是,由于TreeSet的底层实现是基于红黑树的,因此在插入、删除操作上可能不如HashSet等数据结构。因此,在使用TreeSet时,需要根据具体场景来选择。

  本文还通过测试用例的方式,演示了如何使用Java中的TreeSet类,实现了向集合中添加元素、输出元素、删除元素等基本操作。通过测试代码的分析,读者可以更好地了解使用TreeSet的具体方法。

  综上所述,通过本文的阅读,读者可以更好地了解并使用TreeSet,从而提高Java编程的效率和质量。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3030785.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 ERNIE 千帆大模型基于 Flask 搭建智能英语能力评测对话网页机器人(详细教程)

ERNIE 千帆大模型 ERNIE-3.5是一款基于深度学习技术构建的高效语言模型&#xff0c;其强大的综合能力使其在中文应用方面表现出色。相较于其他模型&#xff0c;如微软的ChatGPT&#xff0c;ERNIE-3.5不仅综合能力更强&#xff0c;而且在训练与推理效率上也更高。这使得ERNIE-3…

idea-自我常见配置

1. 主题配置 2. 显示方法分隔符 Editor->General->Appearance 3. 忽略大小写提示 Editor->General->Code Completion 4. 自动导包 Editor->general->Auto Import 5. 取消单行显示Tabs Editor->General->Editor Tabs 效果如下图&#xff1a; 6. 设置…

2024中国大学排名爬取

在pycharm中编写如下代码&#xff1a; import requests from bs4 import BeautifulSoup import bs4 import re def getHTMLText(url):try:r requests.get(url,timeout 30)r.raise_for_status()r.encoding r.apparent_encodingreturn r.textexcept:return ""def r…

ctfshow web入门 php反序列化 web267--web270

web267 查看源代码发现这三个页面 然后发现登录页面直接admin/admin登录成功 然后看到了 ///backdoor/shell unserialize(base64_decode($_GET[code]))EXP <?php namespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){…

【半夜学习MySQL】库的操作(含库的创建、删除、修改、备份操作/查看mysql连接情况/字符集和校验规则详谈)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 创建数据库字符集和校验规则查看字符集合校验规则校验规则对数据库的影响 操纵数据库数据备份和恢复查看连接情况 创建数据库…

6.数据库

1.实体用矩形表示&#xff0c;属性用椭圆表示&#xff0c;联系用菱形表示 2.层次模型用数表示 3.网状模型用图结构表示 4.关系模型用二维表格结构来表示 5.概念模式基本表 外模式视图 内模式存储 6.模式/内模式映像 外模式/模式映像 7.数据的物理独立性 跟内模式关系 逻辑是视图…

Llama 3 是怎么回事?Arena 数据分析

4 月 18 日,Meta 发布了他们最新的开放权重大型语言模型 Llama 3。从那时起,Llama 3-70B 就在 English Chatbot Arena 排行榜上迅速上升,拥有超过 50,000 次对战。Meta 的这一非凡成就对开源社区来说是个好消息。在这篇博文中,我们旨在深入探讨为什么用户将 Llama 3-70b 与 GPT…

经开区创维汽车车辆交接仪式顺利举行,守护绿色出行助力低碳发展

5月10日&#xff0c;“创维新能源汽车进机关”交车仪式于徐州顺利举行&#xff0c;20辆创维EV6 II正式交付经开区政府投入使用。经开区陈琳副书记、党政办公室副主任张驰主任、经开区公车管理平台苑忠民科长、创维汽车总裁、联合创始人吴龙八先生、创维汽车营销公司总经理饶总先…

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

初识C语言——第十七天

选择语句&#xff1a;switch switch语句&#xff08;整型表达式&#xff09; { 语句项&#xff1a; } 而语句项是什么呢&#xff1f; //是一些case语句&#xff1a; //如下 case 整形常量表达式&#xff1b;常量可以&#xff0c;字符也可以&#xff08;因为字符存储的时…

C++:虚函数表Hook

Hook 在计算机编程中&#xff0c;"Hook"&#xff08;钩子&#xff09;是一种技术&#xff0c;用于拦截并修改特定事件或函数的执行流程。它允许程序员在特定的代码点插入自定义的代码&#xff0c;以实现对程序行为的修改、监视或增强。 虚函数表Hook 虚函数表&#…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决&#xff1a;关键文件缺失&#xff0c;多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

C++随手写一个打字练习软件TL(TypeLetters)附原码

C随手写一个打字练习软件TL&#xff08;TypeLetters&#xff09;附原码 说明 软件名称&#xff1a;TL&#xff08;TypeLetters&#xff09; 开发语言&#xff1a;C 适合人群&#xff1a;零基础小白或C学习者 软件功能&#xff1a;打字练习软件TL&#xff08;TypeLetters&#…

C语言 | Leetcode C语言题解之第82题删除排序链表中的重复元素II

题目&#xff1a; 题解&#xff1a; struct ListNode* deleteDuplicates(struct ListNode* head) {if (!head) {return head;}struct ListNode* dummy malloc(sizeof(struct ListNode));dummy->next head;struct ListNode* cur dummy;while (cur->next && cu…

性能测试 --概念

什么是性能测试 性能测试和功能测试都是在系统测试阶段运行, 两者有什么区别呢? 案例:豌豆射手和三线射手都是射手, 它们的功能都是向前发射豌豆进行攻击, 能够攻击到地面的僵尸. 但是从性能上来讲, 豌豆射手只能攻击到一路的僵尸, 而三线射手能同时攻击三路(注:放在边路实际…

用户体验优化uxo指的是什么?

用户体验优化(User Experience Optimization&#xff0c;简称UXO)是一种专注于改善和提升用户在使用企业产品或服务时的整体感受和体验的过程。简单来说&#xff0c;它旨在通过改进产品或服务的设计和功能&#xff0c;使用户在使用过程中感到更加愉悦、满意和高效。用户体验优化…

区块链的跨链交互:从学校间交流看跨链技术

区块链是一种去中心化的分布式账本技术&#xff0c;它通过加密学和共识机制来确保数据的安全性和不可篡改性。每个区块链就像一所独立的学校&#xff0c;有自己的制度、学生和重点专业。它们各自运行&#xff0c;有时在同一领域展开不同的活动。随着区块链技术的不断发展&#…

Excel中实现md5加密

1.注意事项 (1)在Microsoft Excel上操作 (2)使用完&#xff0c;建议修改的配置全部还原&#xff0c;防止有风险。 2.准备MD5宏插件 MD5加密宏插件放置到F盘下&#xff08;直接F盘下&#xff0c;不用放到具体某一个文件夹下&#xff09; 提示&#xff1a;文件在文章顶部&…

【Mac】Indesign 2023 Mac(ID2023) v18.5中文版安装教程

软件介绍 Adobe InDesign是一款由Adobe Systems开发的桌面排版软件&#xff0c;旨在用于创建、编辑和格式化印刷和数字出版物&#xff0c;如书籍、杂志、报纸、传单等。以下是一些关于Adobe InDesign的主要特点和功能&#xff1a; 1.强大的排版工具&#xff1a;InDesign提供了…

表面的相似,本质的不同

韩信与韩王信&#xff0c;两个韩信的结局都是被刘邦所杀&#xff0c;似乎结局类似。但是&#xff0c;略加分析&#xff0c;就会发现其中存在本质的区别。 韩信属于必杀。他的王位是要来的&#xff0c;有居功自傲的本意&#xff0c;功高震主而且毫不避讳。而且年轻&#xff0c;…