day10-Set集合

1.Set

那接下来我们来看Collection单列集合体系的第二部分 Set集合。

在这里插入图片描述

1.1 Set集合概述和特点

Set集合特点

1.可以去除重复

2.存取顺序不一致

3.没有带索引的方法,所以不能使用普通fori循环遍历,也不能通过索引来获取,删除Set集合里面的元素

Set集合练习

存储字符串并遍历

1.2 数据结构-树

在这里插入图片描述

1.3 红黑树

平衡二叉B树

每一个节点可以是红或者黑

红黑树不是高度平衡的,它的平衡是通过“自己的红黑规则"进行实现的

在这里插入图片描述

2.HashSet

2.1 HashSet集合概述和特点

HashSet集合特点

1.底层数据结构是哈希表

2.存取无序

3.无索引 所以不能使用普通for循环遍历

4.不能存在重复值

HashSet集合练习

存储字符串并遍历

扩展:什么是哈希表?

什么是哈希表?
哈希表是一种以键值key存储数据value的结构,以key作为标识值存储value值;只要输入待查找的key,即可获取其对应的value值public HashSet() {map = new HashMap<>();}

163/16

2.2 哈希值

在了解哈希表之前我们要先了解哈希值。

哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

Object类中有一个方法可以获取对象的哈希值

public int hashCode():返回对象的哈希码值

在存入set集合的时候会调用hash算法

**哈希算法 **

根据元素的哈希值跟数组的长度求余计算出存入的位置

对象的哈希值特点
同一个对象多次调用hashCode()方法返回的哈希值是相同的

默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同

我们在之前重写过Object的equals方法

Java中规定:
(1)如果两个对象通过equals方法比较是相等的,那么它们的hashCode方法结果值也是相等的。
(2)如果两个对象通过equals方法比较是不相等的,那么它们的hashCode方法结果值不一定不相等。

代码展示:

public class Animal {private String name;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Animal)) return false;Animal animal = (Animal) o;return Objects.equals(name, animal.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
}public class Test {public static void main(String[] args) {String s1 = "山东高合";String s2 = "山东高合";String s3 = "山东高合科技";String s4 = "山东高合科技";System.out.println(s1.hashCode());//725470523System.out.println(s2.hashCode());//725470523System.out.println(s3.hashCode());//1393462602System.out.println(s4.hashCode());//1393462602Animal a = new Animal();Animal b = new Animal();System.out.println(a.hashCode());//31System.out.println(b.hashCode());//31System.out.println(a.equals(b));//true}
}

哈希的常见应用场景:

在日常运营活动中,我们活动开发经常遇到的应用场景是
1.安全加密、
2.唯一标识、
3.数据校验。
4.散列函数
5.负载均衡

常见数据结构之哈希表

哈希表JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组

JDK8以后,在长度比较长的时候,底层实现了优化,采用的是数组+二叉树

HashSet1.7版本原理

164/16

HashSet<String> hm = new HashSet<>();//是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap

在这里插入图片描述

创建一个默认长度16,默认负载因子为0.75的数组,数组名table
根据元素的哈希值跟数组的长度计算出应存入的位置
判断当前位置是否为null,如果是null直接存入
如果位置不为null,表示有元素,则调用equals方法比较属性值
如果一样,则不存,如果不一样,则存入数组,老元素挂在新元素下面

负载因子是在自动增加其哈希表容量之前允许哈希表获得的满度的度量

当哈希表中的条目数超过负载因子和当前容量的乘积时,哈希表将被重新哈希
(即,内部数据结构将被重建),因此哈希表的存储桶数大约为两倍。通常,默认负载因子(.75)在时间和空间成本之间提供了一个很好的折中方案。
较高的值会减少空间开销,但会增加查找成本(在HashMap类的大多数操作中都得到体现,包括get和put)。设置映射表的初始容量时,应考虑映射中的预期条目数及其负载因子,以最大程度地减少重新哈希操作的数量。如果初始容量大于最大条目数除以负载因子,则将不会进行任何哈希操作。

HashSet1.8 版本原理

底层结构:哈希表。(数组、链表、红黑树的结合体)。
当挂在下面的元素过多,那么不利于查询,所以在JDK8以后,
当链表长度超过 8 的时候,自动转换为红黑树。
存储流程不变。

转为红黑树之后排序规则:通过红黑的的规则进行对哈希值的比较对红黑树的内容进行排序

2.3 并发工具类

创建一个默认长度16,默认负载因子为0.75的数组,数组名table

根据元素的哈希值跟数组的长度计算出应存入的位置

判断当前位置是否为null,如果是null直接存入
如果位置不为null,表示有元素,则调用equals方法比较属性值

如果一样,则不存,如果不一样,则存入数组,新元素挂在老元素下面

当数组存满到16*0.75=12时,就自动扩容,每次扩容原先的两倍

利用HashSet存储自定义元素,必须重写hashCode和equals方法

2.4 案例:HashSet集合存储学生对象并遍历

**需求:**创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
要求:学生对象的成员变量值相同,我们就认为是同一个对象

思路:

1.定义学生类

2.创建HashSet集合对象

3.创建学生对象

4.把学生添加到集合

5.遍历集合(增强for)

6.在学生类中重写两个方法hashCode()和equals()自动生成即可

3.TreeSet

3.1 TreeSet集合概述和特点

TreeSet集合特点

1.元素唯一

2.无索引

3.可以将元素按照规则进行排序

TreeSet集合练习

存储Integer类型的整数,并遍历

存储学生对象,并遍历

 		TreeSet<Student> t1 = new TreeSet<>();t1.add(new Student("一号",16));t1.add(new Student("二号",18));t1.add(new Student("三号",10));t1.add(new Student("四号",15));System.out.println(t1);
//Exception in thread "main" java.lang.ClassCastException: com.itgaohe.lesssion14.Student cannot be cast to java.lang.Comparable 报错!!!必须指定排序规则!!

想要使用TreeSet,需要制定排序规则

3.2 自然排序Comparable的使用

1.使用空参构造创建TreeSet集合

2.自定义的Student类实现Comparable接口

3.重写里面的compareTo​方法

TreeSet集合练习

改写存储学生对象的案例,并按照年龄从小到大排列

Student

public class Student implements Comparable<Student> {private String name;private int age;...getter/setter// 方式一:类自定义比较规则@Overridepublic int compareTo(Student o) {return this.age - o.getAge();}
}

再次运行

3.3 自然排序简单原理图

1.如果返回值为负数,表示当前存入的元素是较小值,存左边
2.如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
3.如果返回值为正数,表示当前存入的元素是较大值,存右边

在这里插入图片描述

3.4 案例:按照年龄排序

需求:改写刚刚的学生案例;

要求:按照年龄从小到大排,如果年龄一样,则按照姓名首字母排序
如果姓名和年龄一样,才认为是同一个学生对象,不存入。

代码展示:

Student

// 方式一:类自定义比较规则 @Overridepublic int compareTo(Student o) {//按照年龄从小到大排int r = this.age-o.age;//年龄一样 咱要首字母存入r = (r==0?this.name.compareTo(o.getName()):r);return r;}
		TreeSet<Student> t1 = new TreeSet<>();t1.add(new Student("amy",15));t1.add(new Student("betty",15));t1.add(new Student("carrt",15));t1.add(new Student("dog",15));t1.add(new Student("green",15));t1.add(new Student("hs",16));t1.add(new Student("icon",17));t1.add(new Student("efls",15));t1.add(new Student("fer",15));t1.add(new Student("fery4",15));

打印结果

[Student{name='amy', age=15}, Student{name='betty', age=15}, Student{name='carrt', age=15}, Student{name='dog', age=15}, Student{name='efls', age=15}, Student{name='fer', age=15}, Student{name='fery4', age=15}, Student{name='green', age=15}, Student{name='hs', age=16}, Student{name='icon', age=17}]

3.5 比较器排序Comparator的使用

1.TreeSet的带参构造方法使用的是比较器排序对元素进行排序的
2.比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare​(T o1,T o2)方法

//o1表示现在要存入的那个元素//o2表示已经存入到集合中的元素

3.重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

练习:

需求:用第二种方式实现下面的需求;

要求:自定义Teacher老师类,属性为姓名和年龄

​ 请按照年龄排序,如果年龄一样,

​ 则按照姓名进行排序。姓名都使用英文字母表示。

代码展示

Teacher


测试:

public static void main(String[] args) {TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {@Overridepublic int compare(Teacher t1, Teacher t2) {int age = t1.getAge() - t2.getAge();age = (age == 0 ? t1.getName().compareTo(t2.getName()) : age);return age;}});ts.add(new Teacher("z", 18));ts.add(new Teacher("s", 18));ts.add(new Teacher("z", 16));ts.add(new Teacher("a", 18));System.out.println(ts);
}

3.6 两种比较方式小结

1.自然排序:自定义类实现Comparable接口,重写compareTo​方法,根据返回值进行排序。
2.比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。
3.在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序

两种方式中,关于返回值的规则:
1.如果返回值为负数,表示当前存入的元素是较小值,存左边
2.如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
3.如果返回值为正数,表示当前存入的元素是较大值,存右边

3.7 案例:按照字符串长短排序

需求:请自行选择比较器排序和自然排序两种方式;
要求:存入四个字符串, “c”, “ab”, “df”, “qwer”
按照长度排序,如果一样长则按照首字母排序

 public static void main(String[] args) {Set<String> set = new TreeSet<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int r = o1.length() - o2.length();r =  r == 0? o1.compareTo(o2):r;return r;}});set.add("c");set.add("ab");set.add("df");set.add("qwer");System.out.println(set);}

3.8 案例:成绩排序

需求:键盘录入3个学生信息(姓名,语文成绩,数学成绩,英语成绩),
按照总分从高到低输出到控制台

思路:

1.定义学生类

2.创建TreeSet集合对象,通过比较器排序进行排序

3.创建学生对象

4.把学生对象添加到集合

5.遍历集合

代码:

public class Student {private int score;public int getScore() {return score;}public void setScore(int score) {this.score = score;}public Student(int score) {this.score = score;}@Overridepublic String toString() {return "Student{" +"score=" + score +'}';}
}

测试:

public static void main(String[] args) {Scanner sc = new Scanner(System.in);Student student = null;Set<Student> set = new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getScore()-o2.getScore();}});for (int i = 0; i < 3; i++) {System.out.println("请输入成绩:");String score = sc.next();int age = Integer.parseInt(score);student = new Student(age);set.add(student);}System.out.println(set);
}

3.9 总结

在这里插入图片描述

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

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

相关文章

【大数据】HDFS、HBase操作教程(含指令和JAVA API)

目录 1.前言 2.HDFS 2.1.指令操作 2.2.JAVA API 3.HBase 3.1.指令操作 3.2.JAVA API 1.前言 本文是作者大数据专栏系列的其中一篇&#xff0c;前文中已经详细聊过分布式文件系统HDFS和分布式数据库HBase了&#xff0c;本文将会是它们的实操讲解。 HDFS相关前文&#x…

哈希算法在区块链中的应用

哈希算法是区块链技术的核心组件之一&#xff0c;它确保了区块链数据的不可篡改性和安全性。在本文中&#xff0c;我们将探讨哈希算法的基本原理&#xff0c;以及它在区块链中的具体应用。 哈希算法的基本原理 哈希算法是一种数学函数&#xff0c;它接收输入&#xff08;或“消…

【Apache Doris】周FAQ集锦:第 3 期

【Apache Doris】周FAQ集锦&#xff1a;第 3 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.5讲 GPIO中断实验-通用中断驱动编写

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Golang | Leetcode Golang题解之第77题组合

题目&#xff1a; 题解&#xff1a; func combine(n int, k int) (ans [][]int) {// 初始化// 将 temp 中 [0, k - 1] 每个位置 i 设置为 i 1&#xff0c;即 [0, k - 1] 存 [1, k]// 末尾加一位 n 1 作为哨兵temp : []int{}for i : 1; i < k; i {temp append(temp, i)}t…

uniapp音乐播放整理

一、前置知识点 1.1 音频组件控制-uni.createInnerAudioContext() 创建并返回内部 audio 上下文 innerAudioContext 对象。 主要用于当前音乐播放&#xff1b; 1.1.1 innerAudioContext属性 属性类型说明只读平台差异说明srcString音频的数据链接&#xff0c;用于直接播放…

vue的css深度选择器 deep /deep/

作用及概念 当 <style> 标签有 scoped 属性时&#xff0c;它的 CSS 只作用于当前组件中的元素&#xff0c;父组件的样式将不会渗透到子组件。在vue中是这样描述的&#xff1a; 处于 scoped 样式中的选择器如果想要做更“深度”的选择&#xff0c;也即&#xff1a;影响到子…

vscode+clangd阅读Linux内核源码

1. 禁用或卸载官方C/C插件. 2. 安装clangd插件 3. 清除之前的产物 4. 生成.config文件 5.编译生成内核镜像 6.编译内核模块 7.编译设备树文件 8.生成compile_commands.json文件 运行上述命令后&#xff0c;在内核源码根目录生成了compile_commands.json文件 9.设置clangd插…

Verlog-串口发送-FPGA

Verlog-串口发送-FPGA 引言&#xff1a; ​ 随着电子技术的不断进步&#xff0c;串口通信已成为嵌入式系统和计算机外设中一种广泛使用的异步通信方式。串口通信因其简单性、可靠性以及对硬件资源的低要求&#xff0c;在数据传输领域扮演着重要角色。在FPGA&#xff08;现场可编…

读天才与算法:人脑与AI的数学思维笔记25_涌现理论

1. 人工智能新闻 1.1. 人工智能新闻报道算法的核心是如何将未经处理的原始数据转换成新闻报道 1.2. 很少有记者为美联社决定使用机器来帮助报道这些新闻持反对意见 1.2.1. 像“Wordsmith”这样的算法&#xff0c;具有自动化的洞察力、科学的叙事能力&#xff0c;现在正被应用…

LINUX 精通 1——2.1.1 网络io与io多路复用select/poll/epoll

LINUX 精通 1 day12 20240509 算法刷题&#xff1a; 2道高精度 耗时 107min 课程补20240430 耗时&#xff1a;99 min day 13 20240512 耗时&#xff1a;200min 课程链接地址 前言 杂 工作5-10年 够用 费曼&#xff1a;不要直接抄&#xff0c;自己写&#xff1b;不要一个…

【WEEK11】 【DAY6】员工管理系统第七部分【中文版】

2024.5.11 Saturday 接上文【WEEK11】 【DAY5】员工管理系统第六部分【中文版】 目录 10.8.删除及404处理10.8.1.修改list.html10.8.2.修改EmployeeController.java10.8.3.重启10.8.4. 404页面处理10.8.4.1.把404.html文件移入10.8.4.2.重启并运行 10.8.5.退出登录状态10.8.5.1…

紫光计算机项目卓越中心负责人孙宇受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 紫光计算机科技有限公司信息技术中心项目总监&卓越中心负责人孙宇先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“PMO卓越中心核心能力拆解与落地-用创新绘制新蓝图”。大会将于6月29-30日在北京举办&#xff0c…

Mistoline: 超高质量控线的Controlnet【附加代码演示】

MistoLine 是 SDXL-ControlNet 模型&#xff0c;可适应任何类型的线条图输入&#xff0c;具有高精确度和出色的稳定性。它可以根据用户提供的各种类型的线稿&#xff08;包括手绘草图、不同的 ControlNet 线稿预处理器和模型生成的轮廓&#xff09;生成高质量图像&#xff08;短…

web入门——导航栏

本专栏内容代码来自《响应式web&#xff08;HTML5CSS3Bootstrap&#xff09;》教材。 导航栏 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&…

【harbor】harbor的搭建与使用

harbor的搭建与使用 文章目录 harbor的搭建与使用1. harbor的下载2. 创建ssl证书3.harbor的配置3. docker修改4.启动harbor5.使用docker总结 1. harbor的下载 harbor仓库地址&#xff1a;https://github.com/goharbor/harbor harbor主要是go语言写的&#xff0c;但是我们dock…

金三银四面试题(二十七):适配器模式知多少?

什么是适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换为客户期望的另一个接口。通过适配器&#xff0c;原本不兼容的接口可以一起工作&#xff0c;从而提高系统的灵活性和可扩展性。 关键元素&…

java中EQ、NE、GE、GT、LE、LT

关系运算符 包括EQ、NE、GE、GT、LE、LT几个&#xff0c;关系运算符返回的是真“True”或假“False”。 eq&#xff08;Equal to&#xff09; 等 运算符 &#xff0c;如果运算符两边相同则返回真&#xff0c;否则返回假&#xff1b; ne&#xff08;Not Equal to&#xff09; 不…

Linux/Brainfuck

Brainfuck Enumeration Nmap 扫描发现对外开放了 22&#xff0c;25&#xff0c;110&#xff0c;143&#xff0c;443 五个端口&#xff0c;使用 nmap 扫描端口详细信息 ┌──(kali㉿kali)-[~/vegetable/HTB/Insane] └─$ nmap -sC -sV -p 22,25,110,143,443 -oA nmap 10.10…

避坑指南!RK3588香橙派yolov5生成RKNN模型!

地址1&#xff0c;转换模型 地址2&#xff0c;转换模型 地址3&#xff0c;解决ppa 下载k2 本文目录 一、将.pt模型转为onnx模型文件。&#xff08;Windows&#xff09;二、将.onnx模型转为.rknn模型文件。&#xff08;Linux&#xff09;三、将.rknn模型部署到开发板RK3588中…