滚雪球学Java(63):Java高级集合之TreeSet:什么是它,为什么使用它?

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • TreeSet
    • 概述
      • TreeSet的特点
      • TreeSet的底层实现
      • TreeSet的构造函数
    • 源代码解析
      • TreeSet的基本操作
      • TreeSet中的红黑树
      • 使用Comparator进行排序
    • 应用场景案例
      • TreeSet的场景
      • TreeSet的优点
      • TreeSet的缺点
    • 类代码方法介绍
      • 构造函数
      • 添加元素
      • 删除元素
      • 查找元素
    • 测试用例
      • 测试结果
      • 测试代码分析
    • 全文小结
  • 总结
    • 附录源码
  • ☀️建议/推荐你
  • 📣关于我

前言

  在Java编程中,集合是一个非常重要的概念。Java中的集合框架就是在Java 2中引入的。集合框架提供了一组标准接口,可以在处理一组对象时使用。Java提供了许多不同的集合类,每个类都有不同的性能和用途。在这篇文章中,我们将介绍Java中的一个高级集合——TreeSet。

摘要

  TreeSet是Java集合框架中的一个类,属于有序的、可排序的集合类。它实现了Set接口,底层是基于红黑树的数据结构实现的。TreeSet可以确保元素的排序顺序,对于需要排序的场景,十分实用。

TreeSet

概述

TreeSet的特点

  • TreeSet是一个有序的集合类,实现了SortedSet接口。
  • TreeSet中的元素会按照插入顺序进行排序,或者根据指定的Comparator进行排序。
  • TreeSet允许null元素,但在判断元素是否相等时需要依靠Comparator来处理。

TreeSet的底层实现

  在Java中,TreeSet的底层数据结构是基于红黑树的数据结构实现的。红黑树是一种近似于平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会大于二倍。

  在红黑树中,每个节点都被标记为红色或黑色。树的根节点是黑色的。如果一个节点是红色的,则它的子节点必须是黑色的(反之不一定成立)。从根节点出发到任意一个空节点的路径上,所经过的黑色节点数量必须相同。

TreeSet的构造函数

  TreeSet提供了多种构造函数,其中最常用的是无参构造函数和带有Comparator参数的构造函数。

无参构造函数的定义如下:

public TreeSet()

在这里插入图片描述

带有Comparator参数的构造函数的定义如下:

    public TreeSet(Comparator<? super E> comparator)

  建议在使用TreeSet时,使用带有Comparator参数的构造函数,可以确保在元素比较时使用指定的比较器。

  如下是部分源码截图:

在这里插入图片描述

源代码解析

TreeSet的基本操作

向TreeSet中添加元素的代码如下:

TreeSet<String> set = new TreeSet<>();
set.add("Java");
set.add("Python");
set.add("C++");

  这段代码会在TreeSet中添加三个元素:Java、Python和C++。由于TreeSet是有序的,因此这些元素将会按照字典序进行排序。

从TreeSet中删除元素的代码如下:

set.remove("Python");

  这段代码将会从TreeSet中删除Python元素。

判断TreeSet中是否存在指定元素的代码如下:

boolean isExist = set.contains("Java");

  这段代码将会判断TreeSet中是否存在Java元素,如果存在,返回true,否则返回false。

获取TreeSet中第一个元素的代码如下:

String first = set.first();

这段代码将会获取TreeSet中的第一个元素。

获取TreeSet中最后一个元素的代码如下:

String last = set.last();

这段代码将会获取TreeSet中的最后一个元素。

  如下是部分源码截图:

在这里插入图片描述

TreeSet中的红黑树

  TreeSet底层维护了一个红黑树。在红黑树的插入、删除和查找操作中,时间复杂度都是O(log n)的。

  由于红黑树是一个有序的二叉树,因此TreeSet中的元素也是有序的。在调用TreeSet的add方法时,会调用红黑树的插入方法,在插入过程中,会根据元素的大小,将其插入到正确的位置上。

使用Comparator进行排序

  在上面的代码示例中,我们使用了无参构造函数创建了一个TreeSet对象。这种情况下,TreeSet会使用元素对象的compareTo方法进行比较。如果我们希望使用另一种比较方式,可以使用Comparator进行排序。

  Comparator是一个函数式接口,可以通过Lambda表达式创建。例如,我们想要按照字符串长度进行排序,可以这样写:

TreeSet<String> set = new TreeSet<>((a, b) -> a.length() - b.length());
set.add("Java");
set.add("Python");
set.add("C++");

  这段代码将会按照字符串长度进行排序,因此TreeSet中的元素顺序为:C++、Java、Python。

应用场景案例

TreeSet的场景

  当我们需要维护一个有序的集合,并且希望能够高效地进行插入、删除和查找操作时,可以使用TreeSet。TreeSet在实现Set接口的同时,还实现了SortedSet接口,因此可以保证元素的有序性。

TreeSet的优点

  • TreeSet是有序的,可以确保元素的排序顺序。
  • TreeSet底层使用红黑树实现,插入、删除和查找操作的时间复杂度都是O(log n)的。
  • TreeSet允许null元素。

TreeSet的缺点

  • 在判断元素相等时,需要使用Comparator进行处理。
  • TreeSet的底层是一个红黑树,因此对于插入、删除和查找等操作,需要使用树的相关知识进行理解和处理。

类代码方法介绍

下面是TreeSet类中部分重要的方法介绍。

构造函数

public TreeSet()

无参构造函数,创建一个空的TreeSet对象。

public TreeSet(Comparator<? extends E> comparator)

带有Comparator参数的构造函数,创建一个空的TreeSet对象,并使用指定的Comparator进行排序。

添加元素

public boolean add(E e)

向TreeSet中添加元素。

删除元素

public boolean remove(Object o)

从TreeSet中删除指定元素。

查找元素

public boolean contains(Object o)

判断TreeSet中是否包含指定元素。

public E first()

获取TreeSet中的第一个元素。

public E last()

获取TreeSet中的最后一个元素。

测试用例

下面是一个简单的测试用例,用于测试TreeSet的基本功能。

package com.demo.javase.day63;

import java.util.TreeSet;

/**
 * @Author bug菌
 * @Date 2023-11-06 11:01
 */
public class TreeSetTest {

    public static void main(String[] args) {
        TreeSet<String> set = new TreeSet<>();
        set.add("Java");
        set.add("Python");
        set.add("C++");

        System.out.println(set.contains("Java")); // true
        System.out.println(set.contains("Ruby")); // false

        System.out.println(set.first()); // C++
        System.out.println(set.last()); // Python

        set.remove("Python");
        System.out.println(set.contains("Python")); // false
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  该代码是一个 Java 程序,主要演示了使用 TreeSet 类来创建一个可排序的集合,并对集合进行添加、查询、删除等操作。具体分析如下:

  1. 导入 java.util.TreeSet 类。

  2. 在 main 方法中,创建一个 TreeSet 实例对象,并添加三个字符串类型的元素:“Java”、“Python”、“C++”。

  3. 使用 contains 方法查询该集合是否包含某个元素,输出查询结果。例如,查询集合是否包含字符串 “Java” 和 “Ruby”,输出结果分别为 true 和 false。

  4. 使用 first 和 last 方法,分别输出集合中的第一个元素和最后一个元素。例如,输出结果分别为:“C++” 和 “Python”。

  5. 使用 remove 方法,删除集合中的某个元素,并使用 contains 方法查询该元素是否还在集合中。例如,删除元素 “Python” 后,再次查询该元素是否在集合中,输出结果为 false。

全文小结

  在本文中,我们介绍了Java高级集合之TreeSet。我们先对TreeSet的特点、底层实现方式进行了介绍,然后介绍了TreeSet的基本操作和使用Comparator进行排序的方法。接着,我们介绍了TreeSet的应用场景及其优缺点,并对TreeSet类的部分重要方法进行了介绍。最后,我们还编写了一个简单的测试用例,对TreeSet进行了测试。

总结

  本文介绍了Java高级集合之TreeSet,它是一种有序的、可排序的集合类。TreeSet底层使用红黑树数据结构实现,能够快速进行插入、删除和查找操作,且能保证元素的有序性。我们可以使用无参构造函数或带有Comparator参数的构造函数创建TreeSet对象,并使用相关方法进行添加、删除和查找操作。此外,本文还简述了TreeSet的应用场景、优缺点和重要方法,并提供了一个简单的测试用例进行演示。

  …

  好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java Elasticsearch 按一定时间间隔(timeInterval)循环查询数据

最近有个需求&#xff0c;前端传入时间间隔&#xff0c;去elasticsearch按照时间间隔统计每个时间间隔内数据量。 public List<HashMap<String,Object>> getCount(RequestParam Integer time, RequestParam String selectedDatedTime) {SimpleDateFormat format n…

Karmada调度器

调度器就像一个发动机&#xff0c;如果没有了发动机输入动力&#xff0c;是无法正常运行的。就像 Kubernetes 的调度器&#xff0c;它会负责根据节点的资源状态、Pod 的运行状态&#xff0c;判断 Pod 是调度到怎样的集群节点上去。对于 Karmada 这样的多云能力的调度器来说&…

Webpack 性能优化 二次编译速度提升3倍!

本文作者为 360 奇舞团前端开发工程师 Rien. 本篇文章主要记录 webpack 的一次性能优化。 现状 随着业务复杂度的不断增加&#xff0c;项目也开始变得庞大&#xff0c;工程模块的体积也不断增加&#xff0c;webpack 编译的时间也会越来越久&#xff0c;我们现在的项目二次编译的…

【fbtft】如何添加fbtft驱动

获取lcd ic的datasheet&#xff0c;或者直接找到其他平台&#xff08;linux&#xff0c;stm32&#xff0c;esp32&#xff09;的驱动 我用的是合宙的esp32驱动&#xff0c;注意是c语言的&#xff0c;合宙上层用lua封装了&#xff0c;需要找到sdk源码。 源码路径&#xff1a; …

2021年09月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 如下图所示,小明想要做一个文字逐字出现的动画效果,他画出了程序的流程图,以下哪个程序可以实现? A: B: C: D: 答案&#

代号:408 —— 1000道精心打磨的计算机考研题

文章目录 &#x1f4cb;前言&#x1f3af;计算机科学与技术专业介绍&#xff08;14年发布&#xff09;&#x1f9e9;培养目标&#x1f9e9;毕业生应具备的知识和能力&#x1f9e9;主要课程 &#x1f3af;代号&#xff1a;408&#x1f525;文末送书&#x1f9e9;有什么优势&…

干货 | Elasticsearch 8.11 ES|QL 初体验

这里没有理论&#xff0c;只有验证后的结论和体验。 前提&#xff1a;这是 8.11 版本的新功能&#xff0c;必须提前安装最新 8.11 版本。 1、对比参考实现 1.1 DSL 原始语法 POST kibana_sample_data_ecommerce/_search 1.2 ES|QL 检索语法&#xff0c; 类似SQL实现 POST /_que…

2023亚太杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

机器学习—基本术语

目录 1.样本&#xff08;示例&#xff09; 2.属性 3.属性值 4.属性空间 5.样本空间 6.学习&#xff08;训练&#xff09; 7.数据集 8.测试 9.假设 10.学习器 11.标记 12.样例 13.标记空间&#xff08;样例空间&#xff09; 14.分类与回归 15.有监督学习、无监督…

GZ038 物联网应用开发赛题第5套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第5套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考评…

城市内涝对策,万宾科技内涝积水监测仪使用效果

随着城市化进程的加速&#xff0c;城市道路积水问题明显越来越多&#xff0c;给人们的出行和生活带来更多的不便。内涝积水监测仪作为高科技产品能够实时监测道路积水情况&#xff0c;为城市排水系统的管理和维护提供重要的帮助。 在城市生命线的基础设施规划之中&#xff0c;地…

Spring Cloud

1. 服务拆分和远程调用 任何分布式架构都离不开服务的拆分&#xff0c;微服务也一样。服务拆分&#xff1a;一个单体架构按照功能模块进行拆分&#xff0c;变成多个服务。 微服务需要根据业务模块拆分&#xff0c;做到单一职责&#xff0c;不要重复开发相同业务。 1.1 服务…

【论文阅读】(CGAN)Conditional Generative Adversarial Nets

论文地址&#xff1a;[1411.1784] Conditional Generative Adversarial Nets (arxiv.org) - 条件生成式对抗网络&#xff1b; 解读&#xff1a; 这篇论文中的Conditional GAN和原生GAN在结构上没有太大差别&#xff0c;时间也是紧随着原生GAN出来的&#xff0c;它的思想应该后…

理解Vue源码,从0开始撸了一个简版Vue

vue 的双向绑定、虚拟dom、diff算法等等面试常见问题你可能在几年前就学过了&#xff0c;其中有些人可能看过Vue的源码&#xff0c;了解过Vue是如何实现数据监听和数据绑定这些技术的。不过让从零开始实现一个 vue&#xff0c;你可以吗? 模板语法其实早就存在&#xff0c;在V…

03-学成在线内容管理模块之课程查询

课程查询 需求分析 教学机构人员点击课程管理按钮进入课程查询界面,在课程列表页面输入查询条件查询课程的信息 当不输入查询条件时默认会全部课程信息,输入查询条件会查询符合条件的课程信息,约束条件是本教学机构查询本机构的课程信息 数据模型(model工程) 课程查询功能…

MAT工具定位分析Java堆内存泄漏问题方法

原创/朱季谦 一、MAT概述与安装 MAT&#xff0c;全称Memory Analysis Tools&#xff0c;是一款分析Java堆内存的工具&#xff0c;可以快速定位到堆内泄漏问题。该工具提供了两种使用方式&#xff0c;一种是插件版&#xff0c;可以安装到Eclipse使用&#xff0c;另一种是独立版…

论文浅尝 | 用于开放式文本生成的事实增强语言模型

笔记整理&#xff1a;李煜&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/hash/df438caa36714f69277daa92d608dd63-Abstract-Conference.html 1. 动机 生成式语言模型&#xff08;例如 GPT-3…

【图论】最小生成树(python和cpp)

文章目录 一、声明二、简介三、代码C代码Python代码 一、声明 本帖持续更新中如有纰漏望指正&#xff01; 二、简介 &#xff08;a&#xff09;点云建立的k近邻图&#xff08;b&#xff09;k近邻图上建立的最小生成树 最小生成树 (Minimum Spanning Tree&#xff0c;简称 M…

使用Tauri开发桌面应用

本文是对视频 Tauri入门教程[1]的学习与记录 Tauri官网[2] 对 node版本有要求 创建项目及目录介绍: 项目的目录结构如下 可以安装推荐的插件 执行npm run tauri build出错,根据 https://github.com/tauri-apps/tauri/issues/7430 执行 yarn add -D tauri-apps/cli && y…

缺陷预测(一)——论文复现

运行CGCN文件 问题一&#xff1a;CNN输入维度的问题出现的问题解决问题原因 问题二&#xff1a;mix时&#xff0c;输入的train_in和train_gen.inputs数据格式不一致出现的问题解决问题 最终结果 问题一&#xff1a;CNN输入维度的问题 出现的问题 数据集改好之后&#xff0c;出…