Set接口和常用方法

news2025/7/22 21:12:58

Set接口基本介绍

  1. 无序(添加和取出顺序不一样),没有索引
  2. 不允许重复元素,所以最多包含一个null

Set接口的常用方法和List一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样

Set接口的遍历方式

同Collection的遍历方式一样,因为Set接口是Collection接口的子接口

  1. 可以使用迭代器
  2. 增强for
  3. 不能使用索引的方式来获取,(即不能使用普通for循环)

Set接口实现类-HashSet

HashSet的全面说明

  1. HashSet实现了Set接口
  2. HashSet实际上是HashMap

 

  1. 可以存放null值,但是只能有一个null
  2. HashSet不保证元素是有序的,取决于hash后,在确定索引的结果
  3. 不能有重复元素/对象

HashSet底层机制说明

HashSet底层是HashMap,HashMap底层是(数组+链表+红黑树)

  1. HashSet底层是HashMap
  2. 添加一个元素,先得到hash值 会转成->索引值
  3. 找到存储数据表table,看这个索引位置是否已经存放的有元素
  4. 如果没有,直接加入
  5. 如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则以链表添加在最后
  6. 在Java8中,如果一条链表的元素个数超过TREEIFY_THRESHOLD(默认是8),并且table的大小>=MIN_TREELFY_CAPACITY(默认64),就会进行树化(红黑树)

分析HashSet的扩容和转成红黑树机制

  1. HashSet底层是HashMap,第一次添加时,table数组扩容到16*加载因子(loadFactor)是0.75=12
  2. r如果table数组使用到了临界值12,就会扩容到16*2=32,新的临界值就是32*0.75=24,就会扩容到32*2=64,以此类推
  3. 在Java8中,如果一条链表的元素个数到达TREEIFY_THRSHOLD(默认是8),并且table的大小>=MIN_TREELFY_CAPACITY(默认64),就会进行树化(红黑树),否则仍然采用数组扩容机制

Set接口实现类-LinkedHashSet  -->(HashSet子类)

LinkedHashSet的全面说明

  1. LinkedHashSet是一个HashSet的子类
  2. LinkedHashSet加入元素/数据的顺序和取出顺序是一致的
  3. LinkedHashSet底层维护的是一个LinkedHashMap(是HashMap的子类),底层维护了一个 数组+双向链表
  4. LinkedHashSet根据元素的hashCode值来决定元素的储存位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的
  5. LinkedHashSet 不允许添重复元素

说明

  1. 在LinkedHashSet中维护了一个hash表和双向链表(LinkedHashSet有head和tail)
  2. 每个节点有before和after属性,这样可以形成双向链表
  3. 在添加一个元素时,先求hash值,再求索引,确定该元素在table的位置,然后将添加的元素加入到双向链表中(如果已经存在,不添加[原则和hashSet一样])

//示意代码

Tail.next = newElement;

newElement = tail;

Tail = newElement;

      4.这样的话,我们遍历LinkedHashSet也能确保插入顺序和遍历顺序一致

//1、LinkedHashSet的加入元素/数据顺序  取出元素/数据顺序一致
//2、LinkedHashSet底层维护的是一个LinkedHashMap(是HashMap的子类)
//3、LinkedHashSet底层结构(数组table+双向链表)
//4、添加第一次时,直接将数组table扩容到16,存放的节点类型是LinkedHashMap$Entry
//5、数组是HashMap$node[]存放的元素/数据 是LinkedHashMap$Entry类型

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

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

相关文章

【C++】类与对象基本知识 (构造 析构 拷贝 explicit 对象数组 动态静态对象)

目录 1.类与对象基本概念 2.构造函数 3.析构函数 4.构造和析构函数调用顺序 5.拷贝构造函数 6.浅拷贝和深拷贝 7.初始化列表 8.explicit防止构造函数隐式转换 9.对象数组 10.动态对象 10.1 动态对象创建 10.2 动态对象数组 11.静态成员 11.1 静态成员变量 11.2 …

Java学习笔记(三)

Java学习笔记(三) 文章目录Java学习笔记(三)1 常用API1.1 类 Math1.1.1 abs1.1.2 ceil和floor1.2 System1.2.1 exit()1.2.2 currentTimeMillis()1.2.3 arraycopy()1.3 Runtime1.4 Object1.4.1 System.out.println底层原理1.4.2 equalsString类重写的equals方法1.5 对象克隆1.5.…

代码随想录训练营第24天|回溯算法理论基础、LeetCode 77.组合

参考 代码随想录 回溯算法理论基础 什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法&#xf…

基于Matlab仿真极化双基地雷达系统以估计目标的范围和速度(附源码)

目录 一、系统设置 二、系统仿真 三、使用圆极化接收阵列 四、总结 五、程序 此示例演示如何仿真极化双基地雷达系统以估计目标的范围和速度。发射器、接收器和目标运动学被考虑在内。 一、系统设置 该系统以 300 MHz 的频率运行,使用线性 FM 波形&#xff0…

1526_AURIX TC275 BootROM下

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个是固件启动的流程介绍,在启动的过程中,HSM的RAM必然会被初始化掉。这个之前倒是没有注意到,HSM还是有专门的RAM的。自然,我自己接触到的…

基于springboot题库管理系统的设计与实现

目前,许多高校绝大多数课程还采用考教统一的模式来完成教学过程,这种传统的考试模式在教学到实施考试的过程带有很大的主观随意性和不规范性。另外随着各高校近年来学生规模的扩大,教学任务日益繁重,教师的工作量相应的不断增加。…

【Bio】基础生物学 - 蛋白质 protein

文章目录1. 蛋白质Ref1. 蛋白质 蛋白质是生命的物质基础,是有机大分子,是构成细胞的基本有机物,是生命活动的主要承担者。没有蛋白质就没有生命。 蛋白质的基本组成单位是 氨基酸 (amino acid)\blue{\text{氨基酸 (amino acid)}}氨基酸 (am…

【C++】树?堆?怎么实现?

新的一周过去了,大家有没有对上星期练习的题目更加熟练呢? 上星期和上上星期我们主要学习了顺序表,链表,和用这俩都能实现的栈和队列 那么今天我们看看堆又是什么结构 目录 1.树 介绍 2.堆 介绍 3.堆的实现 1.树の介绍 不就是树…

cartopy绘制中国降雨地图

常用的地图可视化的编程工具有 MATLAB、IDL、R、GMT、NCL 等。相比于ArcGIS、QGIS和ArcGISpro用鼠标点来点去,编程绘图也是有很大的优点的,方便,可批量,美观。 大气科学和气象的朋友们一直使用的应该是 NCL,易用性不错…

Windows 编写自动复制备份、删除文件定时任务脚本

目录 一、backup.bat 脚本内容如下: 二、脚本内容解析 1.自动生成当天日期的目录 2. 删除前 n 天的文件 forfile 命令参数说明: 3.复制文件到指定目录 robocopy 命令参数说明: 结论: 三、设置定时任务 1. 打开 控制面板…

【数据结构】谈谈ArrayList和LinkedList的区别

(此图源于比特高博) 上图简洁明了的列出了二者的不同点 下面咱们详细聊聊具体的 要问的是区别,问不同点,那就得从二者共有的但是不同的点来讨论 1.底层实现上:ArrayList底层是顺序表,采用数组结构&…

引入DDP技术:英特尔网卡让数据处理更高效

英特尔网卡引入DDP技术后,提高了云和NFV部署的数据包处理效率,按需重配置报文处理引擎,让数据处理更高效 ◆可编程报文处理流水线 ◆按需优化工作负载 ◆无需重启服务器 ◆设备使用更高效 ◆无缝启用新服务 Intel Ethernet 700系列产品…

谷粒商城项目总结(一)-基础篇

一、项目简介 本项目适合人群:学过ssm是必须的。项目里有mybatis-plus和springcloud的内容,你可以用本项目来做实践,也可以利用本项目初识cloud,但最好还是对微服务有一定了解。 下好了vargant,如果安装centos7很慢&…

是什么让 NFT 项目成为“蓝筹”?

Nov. 2022, Vincy Data Source: Footprint Analytics - Bluechip Collection 在 NFT 这样一个不稳定和新兴的行业中,要赋予项目为 "蓝筹 " 地位是很难的。然而,不少的 NFT 项目宣称自己是蓝筹项目,但它们是吗? Foot…

从零开始配置vim(29)——DAP 配置

首先给大家说一声抱歉,前段时间一直在忙换工作的事,包括但不限于交接、背面试题准备面试。好在最终找到了工作,也顺利入职了。期间也有朋友在催更,在这里我对关注本系列的朋友表示感谢。多的就不说了,我们正式进入vim …

【案例 5-1】 模拟订单号生成

【案例介绍】 1.任务描述 编写一个程序,模拟订单系统中订单号的生成。例如给定一个包括年月日以及毫秒值的 数组 arr{2019,0504,1101},将其拼接成字符串 s:[201905041101]。要求使用 String 类常用方 法来实现字符串的拼接。 2.运行结果 运行结果如图 5-1 所示 图…

【SRE】Linux加入AD域控

老牌企业一般因为安全要求或者历史遗留要求,会要求服务器加入AD域控 RHEL/CentOS/Ubuntu 加入 Windows ldap 域控 网上有各种各样的方法,很多复杂且模糊,操作到一大半发现没法推进,这个是亲测最好用的办法 使用pbis-open使Linux服…

关于Ubuntu ssh远程连接报错和无法root登录的解决方法

一、使用远程工具连接Ubuntu提示报错 MobaXterm v22.0 版本直接可以远程连接上(前提是sshd服务是开启的状态) 注意:须使用最新版本或较高版本的ssh远程连接工具,进行ssh连接;若使用较低版本的ssh远程连接工具&#xf…

MySQL产生死锁原因

阅读目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍 MySQL 有三种锁的级别:页级、表级、行级 1 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大&#xff0c…

正则表达式(常用最新版)

密码 【1】密码必须为包含大小写字母和数字的组合,不能使用特殊字符,长度在6-10之间。 /^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{6,10}$/ 【2】密码必须为包含大小写字母和数字的组合,可以使用特殊字符,长度在6-10之间。 /^(?.*[a-z]…