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

news2024/11/20 8:24:24

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——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电子书籍、简历模板等海量资料。


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

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

相关文章

【物联网】BDS/GNSS 全星座定位导航模块——ATGM332D-5N

随着科技的不断进步&#xff0c;导航系统已经成为我们日常生活中不可或缺的一部分。传统的导航系统往往只提供基本的地图和路线规划&#xff0c;对于一些特殊需求或个性化定位并不够满足。全星座定位导航模块的出现&#xff0c;为我们带来了全新的导航体验。通过结合星座学说和…

上海亚商投顾:沪指震荡反弹 鸿蒙、算力概念股集体爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡&#xff0c;创业板指冲高回落&#xff0c;市场热点继续轮动。华为鸿蒙概念股继续活跃&#…

Leetcode刷题详解—— 图像渲染

1. 题目链接&#xff1a;733. 图像渲染 2. 题目描述&#xff1a; 有一幅以 m x n 的二维整数数组表示的图画 image &#xff0c;其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。…

计算机组成原理——指令系统题库1-20

1、以下有关指令系统的说法中错误的是什么。 A、 指令系统是一台机器硬件能执行的指令全体 B、 任何程序运行前都要先转化为机器语言 C、 指令系统是计算机软件、硬件的界面 D、 指令系统和机器语言是无关的。 2、在CPU执行指令的过程中&#xff0c;指令的地址由什么给出。…

计算机缺失vcruntime140.dll如何修复?超简单的5个解决方法

在我们日常使用电脑的过程中&#xff0c;可能会遇到各种各样的问题和错误提示。其中&#xff0c;一个比较常见的错误提示就是“vcruntime140.dll丢失”。这个错误通常发生在我们尝试运行某个程序或应用时&#xff0c;系统无法找到或加载所需的vcruntime140.dll文件。 vcruntime…

又卷又累,救救一个将被随机拖死的程序员!

前两天在小红书上看到有人吐槽&#xff1a;“国内做程序员性价比不高&#xff0c;又卷又累&#xff0c;个人时间都被拖死了。” 现在普遍来讲&#xff0c;“卷”都是打工人的现状。 而至于国内程序员性价比不高的话&#xff0c;确实是肉少僧多。工作强度一加持&#xff0c;累自…

3D Gaussian Splatting文件的压缩【3D高斯泼溅】

在上一篇文章中&#xff0c;我开始研究高斯泼溅&#xff08;3DGS&#xff1a;3D Gaussian Splatting&#xff09;。 它的问题之一是数据集并不小。 渲染图看起来不错。 但“自行车”、“卡车”、“花园”数据集分别是一个 1.42GB、0.59GB、1.35GB 的 PLY 文件。 它们几乎按原样…

c++之xml的创建,增删改查

c之xml的创建&#xff0c;增删改查 1.创建写入2.添加3.删除4.修改&#xff1a; 1.创建写入 #include <stdio.h> #include <typeinfo> #include "F:/EDGE/tinyxml/tinyxml.h" #include <iostream> #include <string> #include <Winsock2.…

Pytorch多GPU并行训练: DistributedDataParallel

1 模型并行化训练 1.1 为什么要并行训练 在训练大型数据集或者很大的模型时一块GPU很难放下&#xff0c;例如最初的AlexNet就是在两块GPU上计算的。并行计算一般采取两个策略&#xff1a;一个是模型并行&#xff0c;一个是数据并行。左图中是将模型的不同部分放在不同GPU上进…

2023年最新前端面试题汇总大全(含答案超详细,HTML,JS,CSS汇总篇)-- 持续更新

专项练习–持续更新 HTML篇CSS篇JS篇Vue篇TypeScript篇React篇微信小程序篇前端面试题汇总大全二&#xff08;含答案超详细&#xff0c;Vue&#xff0c;TypeScript&#xff0c;React&#xff0c;微信小程序&#xff0c;Webpack 汇总篇&#xff09;-- 持续更新 前端面试题汇总大…

微信昵称后面的“小耳朵”是干什么用的?

微信&#xff0c;一款我们日常使用频繁的社交软件&#xff0c;它的功能远不止于聊天、刷朋友圈、支付和刷视频。其实&#xff0c;微信的许多不常用功能可以解决我们的实际问题。 聊天时&#xff0c;我发现朋友微信昵称后面多了一个神秘的小耳朵图标&#xff0c;引发了我的好奇心…

PHP使用文件缓存实现html静态化

<?php // 动态生成的内容 $content "<html><body><h1>time:".date("Y-m-d H:i:s")."</h1></body></html>"; // 静态文件保存路径和文件名 $staticFilePath "file.html"; if(file_exists($s…

工具及方法 - 手机扫条码工具: SCANDIT APP

一般扫个链接使用微信扫一扫即可。扫具体条码&#xff0c;可以在微信里搜索小程序&#xff0c;打开也能扫&#xff0c;得到条码内容。 还有其他方式&#xff0c;比如使用淘宝、百度等APP也可以直接扫码条码&#xff0c;还能得到更多的信息。 使用百度的话&#xff0c;不扫条码…

Android实验:Activity界面基础

目录 前言实验目的实验内容实验要求代码实现mainActivityResultActivityactivity_mainactivity_result 结果展示 前言 我们都知道&#xff0c;activity是Android中最重要的组件之一&#xff0c;关于activity的具体内容在这里就不多赘述&#xff0c;主打的就是一个主次分明&…

使用 PYTORCH 进行图像风格迁移

一、介绍 本教程介绍如何实现 由 Leon A. Gatys、Alexander S. Ecker 和 Matthias Bethge 开发的神经风格算法。神经风格或神经传输允许您拍摄图像并以新的艺术风格再现它。该算法采用三幅图像&#xff0c;即输入图像、内容图像和风格图像&#xff0c;并将输入更改为类似于内容…

西门子精彩触摸屏SMART LINE V4 面板使用U盘下载项目程序的具体方法示例

西门子精彩触摸屏SMART LINE V4 面板使用U盘下载项目程序的具体方法示例 WinCC flexible SMART V4 SP1 软件针对SMART LINE V4 面板新增了使用U盘下载项目功能。 注意:“使用U盘下载项目”功能仅支持触摸屏OS版本为V4.0.1.0 及以上的设备。 使用U盘下载项目的步骤可参考以下内…

【汇编】内存的读写与地址空间、寄存器及数据存储

文章目录 前言一、CPU对存储器的读写1.1 cpu对存储器的读写如何进行&#xff1f;1.2 演示 二、内存地址空间三、将各类存储器看作一个逻辑存储器——统一编址内存地址空间的分配方案 三、CPU的组成寄存器是CPU内部的信息存储单元通用寄存器--AX为例“横看成岭侧成峰“ 四、“字…

Vue3 Computed属性

一、引入computed import { computed } from vue; 二、计算属性的使用 &#xff08;一&#xff09;计算属性简写形式 计算属性 computed( ()> { return 计算属性值 }) setup() {let nums reactive({ten: 0, // 十位unit: 0, // 个位});nums.sum computed(() > {re…

C#,数值计算——函数计算,Ratfn的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Ratfn { private double[] cofs { get; set; } private int nn { get; set; } private int dd { get; set; } public Ratfn(double[] num, double[] den) { …

Python 如何实现组合(Composite)设计模式?什么是组合设计模式?

什么是组合&#xff08;Composite&#xff09;设计模式&#xff1f; 组合&#xff08;Composite&#xff09;设计模式是一种结构型设计模式&#xff0c;它允许客户端使用单一对象和组合对象&#xff08;对象的组合形成树形结构&#xff09;同样的方式处理。这样&#xff0c;客…