【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,一经查实,立即删除!

相关文章

微信小程序上线后获取定位失效

描述 微信小程序在开发过程中&#xff0c;不论是模拟器还是真机调试都能正常正常获取定位信息 但是上线后异常 解决 ​ 我这里以uniapp开发举例 manifest.json文件中 >> 微信小程序模块 >> 微信小程序权限配置 >> 勾选位置接口&#xff0c;描述必填&#x…

Python数据分析I

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

在Linux环境中通过Docker运行swift

直接在Linux环境安装 swift 编译环境太难了&#xff0c;总是会遇到各种各样的问题。发现swift可以用docker安装后&#xff0c;分分钟就搞定了&#xff0c;太棒了。 1. 拉取 swift 镜像 docker pull swift:latest2. Linux本地创建程序目录 容器里面创建的文件都是临时的&…

安卓手机平板使用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;保密性和实时性&…

DevOps的原理及应用详解(四)

本系列文章简介&#xff1a; 在当今快速变化的商业环境中&#xff0c;企业对于软件交付的速度、质量和安全性要求日益提高。传统的软件开发和运维模式已经难以满足这些需求&#xff0c;因此&#xff0c;DevOps&#xff08;Development和Operations的组合&#xff09;应运而生&a…

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

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

verilog阻塞和非阻塞语法

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

黑龙江能源行业是否需要进行等保

能源行业确实需要进行等级保护&#xff08;等保&#xff09;测评。根据相关政策和规定&#xff0c;能源行业的信息系统安全保护工作是受到国家法律法规约束的。例如&#xff0c;国家能源局曾发布《电力行业网络与信息安全管理办法》&#xff0c;明确了电力行业网络安全工作的相…

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月份罗森品牌在济南成功开…

统计不同memberGroupId下已过期和未过期的会员人数以及会费总额

根据memberGroupId和effectiveEndTime统计不同分类下的已过期人数和未过期人数&#xff0c;会费&#xff0c;注意&#xff1a;effectiveEndTime可能为空&#xff0c;为空则记为待缴纳人数 1.创建一个用于存储统计结果的类 package com.qhjk.gyzx.module.member.controller.ad…

Inner-IoU

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

在web浏览器中轻松实现动态控制

虽然使用javascript的人很多&#xff0c;但是为了提高开发效率&#xff0c;将库和框架结合起来使用的案例也在增加。其中jquery就是一个流行了很长时间的库。如果只使用标准的javascript来实现&#xff0c;需要编写大量代码才能完成处理&#xff0c;而使用jquery只需要几行代码…

Oracle数据库面试题-7

41. 请解释Oracle数据库中的空间数据处理方法。 Oracle数据库中的空间数据处理 Oracle数据库提供了丰富的空间数据处理功能&#xff0c;包括对二维和三维空间数据的存储、索引、查询和分析。以下是Oracle数据库中空间数据处理的关键特性&#xff1a; 空间数据类型&#xff1a…

防火墙端口定时开放工具v2

自动防火墙端口管理脚本 简介 该脚本用于在指定的时间内自动打开和关闭指定的防火墙端口。它支持 ufw 和 firewalld 两种防火墙工具&#xff0c;并确保脚本在后台运行&#xff0c;即使终端关闭也能继续执行。 #!/bin/bash# 检查参数数量 if [ "$#" -ne 2 ]; thenech…

C++中的if constexpr

目录 摘要 那什么是 if constexpr&#xff1f; 为什么 if constexpr 很重要&#xff1f; 为什么不用普通的 if&#xff1f; 总结 摘要 if constexpr 是 C17 引入的一种条件编译机制&#xff0c;允许在编译时根据条件判断选择性地编译代码。这在模板元编程中尤为重要&…