【set】集合总结

一、Set

Set集合是Collection的子接口,代表一种集合,此种集合是元素不重复.

有两个常用实现类

  • HashSet 是元素不重复,无序,主要是指遍历顺序和插入顺序不一致

  • TreeSet 是元素不重复,排序

  • LinkedHashSet不常用

二、HashSet

1.1 介绍

  • HashSet是Set的实现类

  • 底层是由哈希表实现,其实实际是HashMap实现

  • 允许重复,,无序,主要是指遍历顺序和插入顺序不一致

  • 不保证线程安全,即不同步

  • 方法与父接口Set,Collection中基本一致,就是最基本的集合方法,没有关于下标操作

1.2 演示API

练习常用方法

  • 构造方法

  • 添加,删除,清空,大小,迭代,toArray


掌握: 基本方法使用,演示出去重,遍历顺序问题!!!

public static void main(String[] args) {HashSet<Integer> set = new HashSet<>();set.add(11);set.add(22);set.add(33);set.add(44);set.add(55);System.out.println(set.contains(11));   //判断是否包含某个元素System.out.println(set.isEmpty());      //判断是否为空set.remove(11);                      //移除某个元素System.out.println(set.size());         //返回set的大小Iterator<Integer> iterator = set.iterator();    //使用迭代器迭代set中的元素while (iterator.hasNext()){System.out.print(iterator.next()+" ");}for (Integer i : set) {                 //使用foreach遍历set中的元素,语法糖,等同与迭代器System.out.print(i+" ");}}

1.3 底层原理

  • HashSet底层是哈希表

  • 更直接的是HashSet底层是HashMap

    • 创建HashSet时,其实创建了HashMap

      image-20240605143913477

    • 向set集合add添加元素,其实放在HashMap集合中

      image-20240605144018121

HashSet去重的原理?

  • 向set中存储运算时,调用元素本身的hashCode方法,获得地址值

  • 如果这个地址值在set集合中如果没有相同,就将该元素存储到集合

  • 如果这个地址值在set集合中有相同的,此时调用元素的equals来做判断

    • 如果equals判断为true,属性全部相同,则不存储该元素,即去重

    • 如果equals判断false,属性值有不相同,则存储该元素


简单说就是:

  • 存储的元素地址值不一样,直接存储

  • 地址值一样,再比较equals

    • eqauls判断不等,直接存储

    • equals判断相等,不存

三、LinkedHashSet

        排序且去重

public static void main(String[] args) {LinkedHashSet<Integer> lhs = new LinkedHashSet<>();lhs.add(3);lhs.add(3);lhs.add(1);lhs.add(5);lhs.add(5);lhs.add(4);lhs.add(2);System.out.println(lhs);        //[3, 1, 5, 4, 2]}

四、TreeSet

4.1 介绍

  • TreeSet是Set集合的实现类,也是元素不重复

  • 底层是基于TreeMap实现的,TreeMap底层是基于红黑树(是一种特殊的二叉树)

  • 会对存储的元素进行排序,默认按照自然顺序排序;或者是通过根据构造方法传入的比较器进行排序

4.2 方法api

仅介绍特殊方法

public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>( );
​// 去重,且默认是自然顺序排序set.add(31);set.add(13);set.add(15);set.add(41);set.add(11);set.add(21);System.out.println(set );Integer ceiling = set.ceiling(15);    //返回set中大于等于给定的最小元素System.out.println("ceiling = " + ceiling );
​Integer higher = set.higher(15);      //返回set中严格大于给定元素的最小元素System.out.println("higher = " + higher);
}

4.3 排序+去重原理

通过向TreeSet<Studnet>中添加Student对象,发现会报错, 提示无法将Student转换成Comparable接口

  • 从而发现,之前Integer,String等类能排序是因为它们实现Comparable接口,并且重写comparTo的方法

  • 发现这个方法返回值决定了顺序和去重

    • 当前(this)比指定小(o), 将其(this)放左树杈, 即返回负数,将数据放在左边

    • 当前(this)比指定大(o), 将其(this)放右树杈,即返回正数,将数据放在右边

    • 当前(this)等于指定(o), 0 不放,即返回0,不往树上放,则去除

package com.qf.set;
public class Student implements Comparable<Student>{private int age;private String name;// set get 构造 toString 省略...@Overridepublic int compareTo(Student o) {int n;if (this.age == o.getAge() && this.name.equals(o.getName())){n = 0;                            //返回0则去重} else if (this.age >= o.getAge()){n = 1;                            //返回正数放节点右边} else {n = -1;                           //返回负数放节点左边}return  n;}
}

4.4 比较器排序

new TreeSet() 空参的,默认是使用原始的自然排序,

new TreeSet(Comparator c), 构造方法传入比较器,就会根据比较器排序

// 自定义比较器类,完成对整数倒序排序public class MyIntegerComparator implements Comparator<Integer> {/*** o1 就是当前正在存储的* o2 就是之前存储的*/@Overridepublic int compare(Integer o1, Integer o2) {System.out.println("o1 = " + o1);System.out.println("o2 = " + o2);return o2 - o1;}
}
// 测试public class Demo9 {
​public static void main(String[] args) {
​// 演示1: 创建自定义比较器类对象//TreeSet<Integer> set = new TreeSet<>(new MyIntegerComparator());// 演示2: 改写成匿名内部类写法// TreeSet<Integer> set =//         new TreeSet<>(new Comparator<Integer>( ) {//             @Override//             public int compare(Integer o1, Integer o2) {//                 return o2 - o1;//             }//         });
​new TreeSet<>((o1,o2) -> o2 - o1);set.add(3);set.add(2);set.add(5);set.add(1);set.add(4);
​System.out.println(set );}
}

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

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

相关文章

Python数据分析I

目录 注&#xff1a;简单起见&#xff0c;下文中"df"均写为"表名"&#xff0c;"函数"均写为"HS"&#xff0c;"属性"均写为"SX"&#xff0c;"范围"均写为"FW"。 1.数据分析常用开源库 注释…

安卓手机平板使用JuiceSSH无公网IP远程连接本地服务器详细流程

文章目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? 本文就和大家分享一下如何使用 cpolarJuiceSSH 实现手机端远程连接Linux…

深入ES6:解锁 JavaScript 类与继承的高级玩法

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;Class&#x1f35f;1 类的由来&#x1f35f;2 co…

我国衡器市场规模逐渐扩大 出口量远大于进口量

我国衡器市场规模逐渐扩大 出口量远大于进口量 衡器是利用力的杠杆平衡原理或胡克定律来测定物体质量的一种仪器设备。随着生产技术逐渐进步&#xff0c;衡器的种类逐渐增多。根据衡量方法不同&#xff0c;衡器大致可分为非自动衡器、自动衡器等&#xff1b;根据结构原理不同&a…

操作系统教材第6版——个人笔记6

3.3.4 页面调度 页面调度 当主存空间已满而又需要装入新页时&#xff0c;页式虚拟存储管理必须按照一定的算法把已在主存的一些页调出去 #主存满加新&#xff0c;把已在主存一些页调出选择淘汰页的工作称为页面调度 选择淘汰页的算法称为页面调度算法 页面调度算法设计不当&a…

现代密码学-认证协议

A.B两个用户想通过网络先建立安全的共享密钥再进行保密通信&#xff1f;A(B)如何确信自己正在和B(A)通信而不是C&#xff1f;这种通信方式为双向通信&#xff0c;此时的认证为相互认证。 相互认证 A/B两个用户在建立共享密钥时需要考虑的核心问题&#xff1a;保密性和实时性&…

家政服务小程序,提高企业在市场中的竞争力

近几年&#xff0c;人们对家政的需求持续增加&#xff0c;面对小程序的快速发展&#xff0c;互联网家政的模式成为了市场新的发展方向&#xff0c;越来越多的居民也开始在线上预约家政服务。随着当下人们对家政的需求日益提升&#xff0c;线上家政小程序利用各种信息技术&#…

verilog阻塞和非阻塞语法

阻塞和非阻塞是FPGA硬件编程中需要了解的一个概念,绝大部分时候,因为非阻塞的方式更加符合时序逻辑设计的思想,有利于时钟和信号的同步,更加有利于时序收敛,所以除非特殊情况,尽量采用非阻塞方式。 1,非阻塞代码 非阻塞赋值,A和B是同时被赋值的,具体是说在时钟的上升…

5. MySQL 运算符和函数

文章目录 【 1. 算术运算符 】【 2. 逻辑运算符 】2.1 逻辑非 (NOT 或者 !)2.2 逻辑与运算符 (AND 或者 &&)2.3 逻辑或 (OR 或者 ||)2.4 异或运算 (XOR) 【 3. 比较运算符 】3.1 等于 3.2 安全等于运算符 <>3.3 不等于运算符 (<> 或者 !)3.4 小于等于运算符…

十足正式在山东开疆拓土!首批店7月初开业,地区便利店现全新面貌!

十足便利店将正式进军山东市场&#xff0c;以济南、淄博两座城市为核心发展起点&#xff0c;目前济南市已经有三家十足门店正在装修施工中&#xff0c;首批15家门店将于7月初开业&#xff0c;这标志着十足集团市场战略布局迈出了至关重要的一步。 随着3月份罗森品牌在济南成功开…

Inner-IoU

文章目录 AbstractMethodBBox Regression Mode AnalysisInner-IOU Loss paper code Abstract 作者指出IoU损失在理论上有能力精确描述边界框回归状态&#xff0c;但在实践中&#xff0c;它不能自适应地匹配不同的检测器和检测任务&#xff0c;导致泛化能力较弱。 为了解决这个…

Linux磁盘分区(fdisk)和卷管理详解(VG-LV-PV)

先看整体图&#xff0c;再讲解概念 一、磁盘分区 一个磁盘disk可以分多个区part&#xff0c;用fdisk命令&#xff0c;举例把/dev/vdb划分为/dev/vdb1和/dev/vdb2 二、创建虚拟卷 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;他是磁盘…

基于Sentry+OpenTelemetry实现微服务前后端全链路监控

文章目录 前⾔背景技术⽅案Sentry私有化部署部署环境准备 项目集成前端后端agent探针集成sentry sdk集成增强探针为⽇志注⼊TraceID异常处理SDK⾃定义开发sentry sdk⾃定义开发⾃定义SentryEvent注⼊otel追踪信息⾃定义全局异常上报issue事件新增动态过滤功能 Java Agent Exten…

六位一线AI工程师总结大模型应用摸爬滚打一年的心得,网友:全程高能!

六位一线AI工程师和创业者&#xff0c;把在大模型应用开发上摸爬滚打一整年的心得&#xff0c;全&#xff01;分&#xff01;享&#xff01;了&#xff01; &#xff08;奇怪的六一儿童节大礼包出现了&#xff09; 这篇干货长文&#xff0c;一时间成为开发者社区热议的话题。…

紧急通知!Win10将于2025年终止支持,快来升级Win11吧!

近期&#xff0c;微软更新了官方支持页面&#xff0c;我们可以看到微软官方在2025年10月14日之后&#xff0c;不再为 Win10系统提供安全更新或技术支持。到这个时间&#xff0c;Win10用户的电脑仍可正常工作&#xff0c;但建议Win10用户都升级为Win11版本&#xff0c;接下来小编…

东航携手抖音生活服务开启机票首播,推出国内、国际超值机票次卡

在民航暑运旺季到来之际&#xff0c;越来越多的用户选择提前做好旅行规划&#xff0c;囤下高性价比的出游商品。6月6日18点&#xff0c;中国东方航空&#xff08;以下简称“东航”&#xff09;将在抖音开启首次机票直播&#xff0c;推荐多款超值机票次卡及空中Wi-Fi等特色产品&…

Angular17版本集成Quill富文本编辑器

Angular17版本集成Quill富文本编辑器 前言:网上找了好多富文本资源,对应Angular17版本的且兼容的太少了,且找到不到对应的版本 自己就去网上找个兼容的免费的富文本组件 1.兼容Angular17版本的quill包 "types/quill": "^1.3.10","ngx-quill": …

备战618!各广告平台SDK版本更新;最新支持eCPR指标;新增自动创建广告源平台 | TopOn产品更新

「TopPro 每月产品速递」是由TopOn最新推出的产品专栏&#xff0c;将会以月为周期梳理TopOn最新产品动态&#xff0c;致力于为互联网从业者提供优质服务&#xff0c;引领行业产品发展。 TopPro | 3~5月产品速递 2024.03.01-05.30 01 eCPR指标支持 // 功能描述 TopOn后台支…

C语言字符、数组指针变量

目录 一、字符指针变量 二、数组指针变量 a.数组指针变量是什么 b.数组指针变量的书写格式 c.数组指针变量如何初始化 d.二维数组传参的本质 一、字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针 char* 。 其一般使用&#xff1a; int main() {char ch w…

ES 8的向量检索性能调优实践

前言 ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望: 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。…