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

JavaSE——集合7:Set接口实现类—TreeSet

目录

一、TreeSet基本介绍

二、TreeSet核心方法

三、TreeSet排序方法

四、TreeSet源码解析

1.无参构造时,底层是创建TreeMap对象

2.有参构造时,底层也创建TreeMap对象

3.执行add方法

4.执行put方法 


一、TreeSet基本介绍

  1. TreeSet是 Java 集合框架中的一个有序集合类,其底层实现主要依赖于红黑树(Red-Black Tree)这一数据结构
  2. TreeSet的底层是通过TreeMap实现的
  3. 当我们使用无参构造器,创建TreeSet时,仍然是无序的
  4. 如果希望添加的元素,按照字符串大小来排序,使用TreeSet 提供的一个构造器,可以传入一个比较器(匿名内部类)并指定排序规则

二、TreeSet核心方法

  1. add(E e):向TreeSet中添加一个元素。如果元素已经存在,则不会添加该元素,并返回false;否则,添加元素并返回true。
  2. remove(Object o):从TreeSet中移除一个元素。如果元素存在,则移除该元素并返回true;否则,返回false。
  3. contains(Object o):检查TreeSet是否包含指定的元素。如果包含,则返回true;否则,返回false。
  4. size():返回TreeSet中元素的数量。
  5. isEmpty():检查TreeSet是否为空。如果为空,则返回true;否则,返回false。
  6. first():返回TreeSet中的第一个元素(即最小的元素)。如果TreeSet为空,则抛出NoSuchElementException异常。
  7. last():返回TreeSet中的最后一个元素(即最大的元素)。如果TreeSet为空,则抛出NoSuchElementException异常。
  8. headSet(E toElement):返回一个视图,该视图包含小于指定元素的元素。这个视图是TreeSet的一个子集合,对原TreeSet的修改会影响这个视图,反之亦然。
  9. tailSet(E fromElement):返回一个视图,该视图包含大于或等于指定元素的元素。这个视图同样是TreeSet的一个子集合。
  10. subSet(E fromElement, E toElement):返回一个视图,该视图包含从指定起始元素(包括)到指定结束元素(不包括)之间的元素。这个视图也是TreeSet的一个子集合。

三、TreeSet排序方法

public class TreeSet_ {public static void main(String[] args) {// 默认排序:无序TreeSet treeSet = new TreeSet();// [a, jack, marry, rose, tom]// 按照字符从小到大排序TreeSet treeSet = new TreeSet((o1, o2) -> ((String) o1).compareTo((String) o2));// [a, jack, marry, rose, tom]// 按照字符从大到小排序TreeSet treeSet = new TreeSet((o1, o2) -> ((String) o2).compareTo((String) o1));// [tom, rose, marry, jack, a]// 按照长度从小到大排序TreeSet treeSet = new TreeSet((o1, o2) -> (((String) o1).length()) - (((String) o2).length()));// [a, tom, jack, marry]// 按照长度从大到小排序TreeSet treeSet = new TreeSet((o1, o2) -> (((String) o2).length())-(((String) o1).length()));// [marry, jack, tom, a]/*这个比较器会计算两个字符串 o1 和 o2 的长度差,并返回这个差值作为比较结果。如果结果为负数,则 o1 被认为小于 o2;如果结果为正数,则 o1 被认为大于 o2;如果结果为0,则两个元素相等(但在 TreeSet 中,相等的元素只会被存储一个)。分析添加到 TreeSet 中的字符串:"jack":长度为4"tom":长度为3"rose":长度为4"marry":长度为5"a":长度为1根据比较器的逻辑,这些字符串会被按照长度排序。由于 "jack" 和 "rose" 长度相同(都是4),它们在排序时被认为是相等的。但是,TreeSet 不允许存储重复的元素,因此尽管 "jack" 和 "rose" 内容不同,但由于长度相同,在添加到 TreeSet 时,"rose" 会被视为与已存在的 "jack" 相等,并且不会被添加进去。这就是为什么在遍历 TreeSet 时,"rose" 没有出现的原因。*/// 区分长度相同但内容不同的字符串TreeSet treeSet = new TreeSet((o1, o2) -> {int lengthComparison = Integer.compare(((String) o1).length(), ((String) o2).length());if (lengthComparison != 0) {return lengthComparison;} else {return ((String) o1).compareTo(((String) o2));}});// [a, tom, jack, rose, marry]treeSet.add("jack");treeSet.add("tom");treeSet.add("rose");treeSet.add("marry");treeSet.add("a");System.out.println(treeSet);}
}

四、TreeSet源码解析

1.无参构造时,底层是创建TreeMap对象

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

2.有参构造时,底层也创建TreeMap对象

把传入的比较器对象,赋给了TreeSet的底层的TreeMap的属性this.comparator 

public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;
}

3.执行add方法

因为TreeSet不关注value,所以会有一个静态常量对象放在value的位置 

private static final Object PRESENT = new Object();public boolean add(E e) {return m.put(e, PRESENT)==null;
}3.执行put方法:存放数据

4.执行put方法 

public V put(K key, V value) {Entry<K,V> t = root;if (t == null) {compare(key, key); // type (and possibly null) checkroot = new Entry<>(key, value, null);size = 1;modCount++;return null;}int cmp;Entry<K,V> parent;// split comparator and comparable pathsComparator<? super K> cpr = comparator;if (cpr != null) { // cpr 就是匿名内部类(对象)do {parent = t;// 动态绑定到匿名内部类(对象)comparecmp = cpr.compare(key, t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;else  // 如果相等,即返回0,这个Key就没有加入// value仍然是原来的PRESENT来占位return t.setValue(value);} while (t != null);}

相关文章:

JavaSE——集合7:Set接口实现类—TreeSet

目录 一、TreeSet基本介绍 二、TreeSet核心方法 三、TreeSet排序方法 四、TreeSet源码解析 1.无参构造时&#xff0c;底层是创建TreeMap对象 2.有参构造时&#xff0c;底层也创建TreeMap对象 3.执行add方法 4.执行put方法 一、TreeSet基本介绍 TreeSet是 Java 集合框架…...

【idea技巧篇】idea的类注释和方法注释模版自定义设置

这块idea技巧虽然常用&#xff0c;谁没事会经常修改模版设置呢&#xff0c;一般是搭建开发环境的时候或者开发规范要求等设置一次就行了。用的虽然少&#xff0c;但几乎每次搭建环境都会用到&#xff0c;这里记录下并分享设置的过程已经发现的更高级的一些使用技巧。 注释模版…...

【Kubernetes① 基础】一、容器基础

目录 一、进程二、隔离与限制三、容器镜像总结参考书籍 一、进程 容器技术的兴起源于PaaS技术(平台即服务)的普及&#xff1b;Docker公司发布的Docker项目具有里程碑式的意义&#xff1b;Docker项目通过“容器镜像”解决了应用打包这个根本性难题(CloudFoundry)。 容器本身的价…...

计算机网络第1章(概述)万字笔记详细版

1.1、计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水&#xff0c;电&#xff0c;煤气这些基础设施一样&#xff0c;成为我们生活中不可或缺的一部分 我国互联网发展状况 中国互联网络信息中心CNNIC 1.2、…...

每日一练算法题(堆串的基本操作StrReplace(S, T, V))

6-2 堆串的基本操作StrReplace(S, T, V) 编写算法&#xff0c;实现堆串的基本操作StrReplace(S, T, V)。 初始条件: 串S, T和 V 均已存在,且 V 是非空串。 操作结果: 用V替换主串S中出现的所有与(模式串)T相等的不重叠的子串。输入格式: 第一行&#xff1a;S 第二行&#…...

IRP默认最小流程

IRP是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时&#xff0c;应用程序会发出I/O请求&#xff0c;操作系统将相应的I/O请求转换成相应的IRP&#xff0c;不同的IRP会根据类型被分派到不同的派遣例程中进行处理。 irp相当于R3下的消息&#xff0c…...

【全网最全】AI产品经理面试高频100题答案解析

详细的目录如下&#xff0c;需要的小伙伴可以详细看一下~ 第一章&#xff1a;机器学习和深度学习的关系 第二章&#xff1a;机器学习7大经典算法 算法一&#xff1a;K近邻算法【分类算法】 1.1 KNN 算法的实现原理 1.2 KNN应用场景举例&#xff1a;预测候选人能不能拿到 O…...

VLLM实现大模型服务的部署

文章目录 安装离线推理适配openAI-API的API服务使用python命令行部署使用docker部署调用启动成功的API 安装 # (Recommended) Create a new conda environment. conda create -n myenv python3.9 -y conda activate myenv# Install vLLM with CUDA 12.1. pip install vllm -i …...

Java 基数排序

基数排序&#xff08;Radix Sort&#xff09;是一种非比较型整数排序算法&#xff0c;通常用于对数字进行排序。它按照数字的每一位&#xff08;从最低有效位到最高有效位或从最高有效位到最低有效位&#xff09;进行排序&#xff0c;每次使用一个稳定的排序算法&#xff08;如…...

红帽发送邮件操作

一.将/mnt挂在至/run/media mount /dev/sr0 /mnt 二.查看下载时间 ll /etc/yum.repos.d/ 三.下载安装包 dnf install s-nail -y 四.配置邮件服务 在最下面一行输入######################### 接着输入邮件 set from18013844913163.com set smtpsmtp.163.com set smt…...

学习记录:js算法(六十一):添加与搜索单词 - 数据结构设计

文章目录 添加与搜索单词 - 数据结构设计思路一思路二 添加与搜索单词 - 数据结构设计 请你设计一个数据结构&#xff0c;支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。 实现词典类 WordDictionary &#xff1a; ● WordDictionary() 初始化词典对象 ● voi…...

Jetpack-ObservableField实现双向绑定

ObservableField是Android Data Binding库中的一个类&#xff0c;用于实现双向绑定。双向绑定意味着当数据模型中的数据发生变化时&#xff0c;UI会自动更新&#xff1b;同时&#xff0c;当用户在UI上进行操作时&#xff0c;数据模型也会相应地更新。 1.在你的项目中添加Data …...

STARnak, LTR 模型笔记

未完成. 1. 简述 CIKM 23 的一篇论文, 任务为 Learning To Rank, 输入为 候选集合, 输出为 有序列表, 用于 top-n 推荐场景. 思考: 它是要替代 ctr 预估么?它跟 mind 这种召回, 有啥大的不一样么? 2. 网络结构 u u u: 将用户(或 query) 记为 u H q d X , d Y , . . . H…...

【数据结构】:破译排序算法--数字世界的秩序密码(二)

文章目录 前言一.比较排序算法1.Bubble Sort冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性 2.Quick Sort快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现 2.2.非递归快速排序2.2.1.非递归快速排序原理2.2.2.非…...

2024年《生成式ai大模型》都学什么内容呢?

近期大家都在关注的2024 2024年10月25日 — 2024年10月29日 在成都举办的第八期《新质技术之生成式AI、大模型、多模态技术开发与应用研修班》都学什么内容呢&#xff1f;下面我们来看看&#xff1a; 1.了解AIGC发展现状与核心技术。 2.掌握Transformer核心开发技术。 3.掌握…...

kubernetes自定义pod启动用户

一、kubernetes自定义pod启动用户 一&#xff09;以root用户启动pod containers:- name: ...image: ...securityContext:runAsUser: 0 二&#xff09;以普通用户启动pod 1、从构建镜像角度修改 # RUN命令执行创建用户和用户组&#xff08;命令创建了一个用户newuser设定ID为1…...

C4T避风型电动采光排烟天窗(图集09J621-2)

C4T避风型电动采光排烟天窗是09J621-2《电动采光排烟天窗》图集中的一种窗型。也是一种现代化的建筑消防排烟通风采光设备&#xff0c;被广泛应用于多风地区厂房。 C4T避风型电动采光排烟天窗配有成品避风罩&#xff0c;该避风置由钢制骨架和彩色钢板构成&#xff0c;固定在电动…...

多态常见面试问题

1、什么是多态&#xff1f; 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;它允许同一个接口表现出不同的行为。在C中&#xff0c;多态性主要通过虚函数来实现&#xff0c;分为编译时多态&#xff08;静态多态&#xff09;和运行时多态…...

案例-登录认证(上)

案例-登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登 录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录 认证。 最终我…...

对BSV区块链下一代节点Teranode的答疑解惑(上篇)

​​发表时间&#xff1a;2024年8月7日 2024年初BSV区块链研发团队揭晓了即将到来的Teranode更新的突破性特性&#xff0c;这些特性将显著提升网络的效率和处理速度&#xff0c;使BSV区块链能够达到百万级TPS。 Teranode的项目主管Siggi Oskarsson强调&#xff1a;“当你阅读这…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...