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

JavaSE学习笔记day14

二、Set

Set集合是Collection集合的子接口,该集合中不能有重复元素!!

Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法

Set接口,它有两个常用的子实现类HashSet,TreeSet

三、HashSet

HashSet实现了Set接口,底层是hash表(实际上底层是HashMap)
该类不允许重复元素,不保证迭代顺序,即无序(插入顺序和遍历顺序不一致)

3.1 方法演示

构造方法

  • HashSet() 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16加载因子是 0.75
  • HashSet(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的新 set
  • HashSet(int initialCapacity) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
  • HashSet(int initialCapacity, float loadFactor) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。

方法

HashSet类中的方法与父接口Set接口中的方法一致,即又跟Collection接口中方法一致

…自行演示

   public static void main(String[] args) {// 创建HashSet集合HashSet<Integer> set = new HashSet<>( );// 放入元素boolean r1 = set.add(221);System.out.println(r1 );boolean r2 = set.add(221);System.out.println(r2 );set.add(111);set.add(111);set.add(44);set.add(23);// 遍历(for + Iterator)for(Integer i: set) {System.out.println(i );}// 总结: 顺序问题+ 重复问题// 无序即 插入顺序和迭代顺序不一致// 不允许重复!Iterator<Integer> iterator = set.iterator( );while(iterator.hasNext()) {Integer integer = iterator.next( );System.out.println(integer );}// 演示其他方法(移除,判断,大小等等)System.out.println(set.size() );System.out.println(set.isEmpty( ));set.clear();System.out.println(set.size() );System.out.println(set.isEmpty( ));HashSet<Integer> set2 = new HashSet<>( );set2.add(111);// 移除全部指定元素System.out.println(set.removeAll(set2));System.out.println(set );}

3.2 扩容机制[面试]

HashSet底层是Hash表,其实是HashMap.
默认初始容量16,加载因子0.75 —> 扩容的阈值= 容量 * 因子 = 16 * 0.75 = 12
即超过12个元素时就要触发扩容,扩容成原来的2倍

(ps: 初始容量和加载因子是可以通过构造方法创建时修改的…)

练习1: 将字符串数组String [] arr = {“a”,“a”,“b”,“b”,“c”,“c”}去重,变成String[] arr = {“a”,“b”,c"};

// 思路: 遍历数组,将元素放入set集合,再将set集合转数组(toArray)

3.3 去重原理[面试]

  1. 调用add(E e)方法时,会在底层调用元素e的hashcode方法来获得对象的地址值
  2. 如果地址值不一样,直接存储
  3. 如果地址值一样时,会再调用元素的equals方法判断元素的内容是否一样
  4. 如果equals为false,那么存储 但是如果equals判断值为true,那么去重

以后只需要使用工具生成hashcode和equals就可以再HashSet中去重!

public class Student{// ..其他代码省略// 重写hashcode和equalse@Overridepublic int hashCode() {return Objects.hash(age, name);}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass( ) != o.getClass( )) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}
}
 public static void main(String[] args) {HashSet<Integer> set = new HashSet<>( );set.add(1);set.add(2);set.add(3);set.add(1);System.out.println(set );// 创建几个学生,放入set集合// 设想属性一样的学生会去重HashSet<Student> stuSet = new HashSet<>( );stuSet.add(new Student(18,"zs"));stuSet.add(new Student(19,"ls"));stuSet.add(new Student(19,"ls"));stuSet.add(new Student(20,"ww"));System.out.println(stuSet );}

四、LinkedHashSet

LinkedHashSet 既有Set的去重的特性,又有Linked结构有序的特性,即
存储在LinkedHashSet 中的元素既不允许重复,又能保证迭代顺序

    public static void main(String[] args) {LinkedHashSet<Integer> lhs = new LinkedHashSet<>( );lhs.add(211);lhs.add(111);lhs.add(111);lhs.add(44);lhs.add(44);lhs.add(23);System.out.println(lhs );}

五、TreeSet

TreeSet是基于 TreeMapNavigableSet 的实现.
可以使用元素的自然顺序对元素进行排序或者根据创建 TreeSet 时提供的 Comparator 进行排序,具体取决于使用的构造方法

即TreeSet会对存储的元素排序,当然也会去重!

5.1 方法演示

构造方法

  • TreeSet()构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
  • TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。

方法

有常规的集合的方法(add,remove,Iterator,size等等),还有一些基于树结构能排序的特性才有的特殊方法,例如范围取值的(ceiling(),floor(),lower(),higher(),首尾取值(),first(),last()…)等操作

   public static void main(String[] args) {TreeSet<Integer> set = new TreeSet<>( );set.add(44);set.add(221);set.add(221);set.add(23);set.add(111);set.add(111);set.add(0);set.add(1114);// 发现: 会排序(默认是升序),不能存储重复元素System.out.println(set );for(Integer i : set) {System.out.println(i );}// 获得第一个(排序后)System.out.println("first: " + set.first( ));// 获得最后一个(排序后)System.out.println("last: " + set.last() );System.out.println(set );// 获取并移除第一个(排序后)System.out.println("第1个" + set.pollFirst());// 获取并移除最后一个(排序后)System.out.println("最hou1个" + set.pollLast());System.out.println(set );// 范围取值System.out.println(set.lower(100));}

5.2 去重排序原理

前提知识: TreeSet底层是TreeMap,TreeMap是红黑树,是一种平衡二叉树(AVL)

练习1:新建User类(age,name),创建TreeSet集合,创建多个User对象,将user对象存入TreeSet集合,实现去重排序,1) 年龄和姓名一致则去重 2) 按照年龄从小到大排序

 TreeSet<User> set = new TreeSet<>( );set.add(new User(18,"厄加特"));// 运行报错ClassCastException 无法转成Comparable接口

Comparable接口,强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序.
实现这个接口,需要重写comparTo方法,该方法返回值决定了是升序,降序还是去重!

该comparTo(T t)方法运行时 , this指代当前正在调用该方法的对象,参数T就是之前已经存在的元素.

  • 返回值 0 ,意味着此元素(正在存储的元素)和之前的元素相同,即不存储,则去重
  • 返回值正整数,意味着此元素 大于 之前的元素, 放在该节点的右边
  • 返回值负整数,意味着此元素 小于 之前的元素,放在该节点的左边

最后都存储完毕时,取值时采用中序遍历(从根节点开始按照左,中,右的顺序读取)

image-20230223170611586

public class User implements Comparable<User>{
// 属性和方法.../*** this 是指代正在存储的元素* o    是之前存储的元素*/
@Override
public int compareTo(User o) {System.out.println("此对象--> " + this);System.out.println("指定对象--> " + o);// 姓名和年龄相同返回0,即去重不存储if (this.name.equals(o.getName()) && this.getAge() - o.getAge() == 0) {return 0;}// 年龄相同返回1,即保留下来的不去重的意思// 年龄不同的话就正常相减,返回负数或正数return this.getAge() - o.getAge() == 0 ? 1 : this.getAge() - o.getAge();
}
}

5.3 练习

需求:创建 5个学生信息(姓名,语文成绩,数学成绩,英语成绩),放入TreeSet集合,输出时按照总分从高到低输出到控制台

package com.qf.set;import java.util.TreeSet;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class StudentScore implements Comparable<StudentScore>{private String name;private int chinese;private int math;private int english;// set get 省略// 设计方法,获得总分public int getTotal(){return chinese+math+english;}@Overridepublic String toString() {return "StudentScore{" +"name='" + name + '\'' +"总分='" + getTotal() + '\'' +", chinese=" + chinese +", math=" + math +", english=" + english +'}';}@Overridepublic int compareTo(StudentScore o) {return o.getTotal() - this.getTotal() == 0 ? 1 : o.getTotal() - this.getTotal();}
}class TestStudentScore {public static void main(String[] args) {TreeSet<StudentScore> set = new TreeSet<>( );set.add(new StudentScore("zhang3",70,70,70 ));set.add(new StudentScore("wang5",100,100,100 ));set.add(new StudentScore("li4",80,80,80 ));set.add(new StudentScore("zhao6",60,60,60 ));set.add(new StudentScore("zhou7",90,90,90 ));for (StudentScore score : set) {System.out.println(score );}}
}

六、总结

HashSet 方法与父Collection接口中方法一致,正常记
需要向着面试准备: HashSet底层(HashMap),扩容,去重原理LinkedHashSet 了解TreeSet底层的树结构能了解就行,只需要指定要想去除排序,必须要实现接口重写方法,返回0去重,返回正负如何如何

相关文章:

JavaSE学习笔记day14

二、Set Set集合是Collection集合的子接口,该集合中不能有重复元素!! Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法 Set接口,它有两个常用的子实现类HashSet,TreeSet 三、HashSet HashSet实现了Set接口,底层是hash表(实际上底层是HashM…...

LLVM高级架构介绍

LLVM 为什么要开一个LLVM的新坑呢&#xff1f; 我从智能穿戴转行到芯片软件行业&#xff0c;从事编译器开发&#xff0c;不过是AI编译器。不过基本的传统编译器还是绕不过去啊&#xff0c;所以开始学习LLVM&#xff0c;后面开始学习TVM&#xff0c;MLIR。 LLVM GitHub地址 L…...

全网最经典函数题型【详解】——C语言

文章目录1. 写一个函数可以判断一个数是不是素数。2. 写一个函数判断一年是不是闰年。3. 写一个函数&#xff0c;实现一个整形有序数组的二分查找。4. 写一个函数&#xff0c;每调用一次这个函数&#xff0c;就会将 num 的值增加1。5. 写一个函数&#xff0c;打印乘法口诀表。6…...

emqx桥接配置+常见问题解决+jmeter压测emqx

一&#xff0c;桥接资源配置及规则配置 Emqx桥接配置流程 1&#xff0c;配置资源并测试连接通过 规则引擎——>资源——>新建——>选择MQTT Bridge——>填写参数测试连接 参数描述详见3.1资源配置 2&#xff0c;配置规则 2.1根据实际业务选择合适sql 规则引擎…...

improve-1

类型及检测方式 1. JS内置类型 JavaScript 的数据类型有下图所示 其中&#xff0c;前 7 种类型为基础类型&#xff0c;最后 1 种&#xff08;Object&#xff09;为引用类型&#xff0c;也是你需要重点关注的&#xff0c;因为它在日常工作中是使用得最频繁&#xff0c;也是需要…...

华为OD机试用Python实现 -【云短信平台优惠活动】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲云短信平台优惠活动题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明Python 代码实现代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看…...

Facebook广告投放运营中的关键成功因素是什么?

在当今数字化的时代&#xff0c;广告投放已经成为了各种企业获取市场份额和增加品牌曝光的重要手段之一。Facebook作为全球最大的社交媒体平台之一&#xff0c;其广告投放运营的成功&#xff0c;将直接影响企业的品牌推广和市场营销效果。本文将探讨Facebook广告投放运营中的关…...

2023年1月综合预订类APP用户洞察——旅游市场复苏明显,三年需求春节集中释放

2023年1月&#xff0c;随着国家对新型冠状病毒感染实施“乙类乙管”&#xff0c;不再对入境人员和货物等采取检疫传染病管理措施&#xff0c;并且取消入境后全员核酸检测和集中隔离&#xff0c;横亘在旅游者与旅游目的地之间的隔阂从此彻底消失。2023年1月恰逢春节假期&#xf…...

基于stm32计算器设计

这里写目录标题 完整de代码可q我获取1 系统功能设计2 系统硬件系统分析设计2.1 STM32单片机核心电路设计2.2 LCD1602液晶显示模块电路设计2.3 4X4矩阵键盘模块设计3 STM32单片机系统软件设计3.1 编程语言选择3.2 Keil程序开发环境3.3 FlyMcu程序烧录软件介绍3.4 CH340串口程序烧…...

基于SpringCloud的可靠消息最终一致性02:项目骨架代码(上)

在上一节中咱们已经把分布式事务问题交代了一遍,包括两大定理、五大解决方案和一个成熟的开源框架,而咱们最终的目标是用Spring Cloud实现一个实际创业项目的可靠消息最终一致性的分布式事务方案。 先交代一下项目背景。 前几年,社会上慢慢兴起一种称为C2C同城快递的业务,也…...

RockerMQ集群部署

目录一、Broker集群模式1、单Master&#xff1a;2、多Master多Slave模式异步复制3、多Master多Slave模式同步双写二、集群搭建实践1、集群架构2、克隆生成rocketmqos13、修改rocketmqos1配置文件4、克隆生成rocketmqOS25、修改rocketmqOS2配置文件6、启动服务器7、测试一、Brok…...

unicloud的aggregate聚合查询时间戳转日期

我特么不知道看了这个帖子几百遍才看明白到-----》unicloud数据库中&#xff0c;聚合操作如何操作时间戳&#xff1f; - DCloud问答 自己淋过雨老想着为别人撑伞&#xff0c;可怜我这35岁的老人家&#xff0c;给我去点关注&#xff01;&#xff01;&#xff01;&#xff01;&a…...

Vue2.0开发之——使用ref引用组件实例(41)

一 概述 在本组件内部修改count的值在父组件内修改子组件的count值 二 在本组件内部修改count的值 2.1 Left.vue 布局代码 <template><div class"left-container"><h3 >Left 组件---{{count}}</h3><button click"count 1"&…...

极狐GitLab仓库瘦身

参考文章&#xff1a; [分享] 极狐GitLab仓库瘦身 - 官方技术分享 - 极狐GitLab 论坛 一、瘦身概述 Git仓库随着时间推移会变得越来越大&#xff0c;比如很多比较大的文件加入Git仓库时&#xff0c;可能引起以下问题&#xff1a; 下载仓库越来越慢&#xff0c;因为每个人都…...

2288hv5超融合服务器 数码管报888

【问题现象】 2288hv5超融合服务器&#xff0c;前面板数码管报888&#xff0c;电源灯黄灯闪烁&#xff0c;开不了机&#xff0c;ibmc网络是通的&#xff0c;但是web网页打不开 【问题原因】 iBMC的版本过低&#xff0c;iBMC在智能诊断数据库保护机制存在异常&#xff0c;导…...

【Zabbix实战之部署篇】Zabbix监控windows系统配置方法

【Zabbix实战之部署篇】Zabbix监控windows系统配置方法 一、检查Zabbix监控平台状态1.检查Zabbix各组件状态2.检查Zabbix的首页二、下载windows代理1.访问Zabbix官网下载界面2.查看下载安装包三、安装windows agent2代理1.安装windows agent2代理2.代理基本配置信息3.开始进行安…...

在Windows上编译Nginx

《在Windows上编译Nginx》视频教程官方编译说明 Building nginx on the Win32 platform with Visual C 环境准备 1. Microsoft Visual Studio(Microsoft Visual C 编译器)&#xff0c;下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/。 2. Git(备用)&…...

语音识别与Python编程实践

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

MATLAB绘制泰勒图(Taylor diagram)

泰勒图&#xff08;Taylor diagram&#xff09; 泰勒图是Karl E. Taylor于2001年首先提出&#xff0c;主要用来比较几个气象模式模拟的能力&#xff0c;因此该表示方法在气象领域使用最多&#xff0c;但是在其他自然科学领域也有一定的应用。 泰勒图常用于评价模型的精度&…...

ClickHouse高可用集群分片-副本实操(四)

目录 一、ClickHouse高可用之ReplicatedMergeTree引擎 二、 ClickHouse高可用架构准备-环境说明和ZK搭建 三、高可用集群架构-ClickHouse副本配置实操 四、ClickHouse高可用集群架构分片 4.1 ClickHouse高可用架构之两分片实操 4.2 ClickHouse高可用架构之两分片建表实操 一…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema&#xff0c;不需要复杂的查询&#xff0c;只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 &#xff1a;在几秒钟…...

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.

这个警告表明您在使用Vue的esm-bundler构建版本时&#xff0c;未明确定义编译时特性标志。以下是详细解释和解决方案&#xff1a; ‌问题原因‌&#xff1a; 该标志是Vue 3.4引入的编译时特性标志&#xff0c;用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...