HashSet 、LinkedHashSet 源码级详解

news2024/10/5 12:55:04

Set 集合类体系如下:

HashSet -- 无序、不重复、无索引

LinkedHashSet -- 有序、不重复、无索引

TreeSet -- 可排序、不重复、无索引

HashSet

HashSet 底层采用 哈希表 存储数据

哈希表组成

JDK8 之前  -- 数组 + 链表

JDK8 之后  -- 数组 + 链表 +红黑树

一开始会把元素存储在数组中,但是哈希表会出现同一个索引位置要存储多个元素的情况,因此要将同一个索引位置的多个对象用链表或红黑树进行存储

哈希表的核心 -- 哈希值

哈希值我们可以理解为对象的整数形式

因为在哈希表存储的时候,不是从索引零开始按序存储的,而是根据公式

int index = (数组长度 - 1 )& 哈希值

index就是对象存储的位置

对象可以根据 hashCode 方法计算出哈希值,该方法定义在Object类中,因此所有对象都可调用,默认使用地址值进行计算,但是一般情况下用对象的地址值计算哈希值的意义不大,因此一般情况下会重写 hashCode 方法,利用对象内部属性计算哈希值

关于 hashCode 方法 重写,最重要的是 hashCode 方法和 equals 方法的联系,可以参考以下博客

(8条消息) 为什么重写 equals 方法就必须重写 hashCode 方法?_Fearless____的博客-CSDN博客https://blog.csdn.net/Fearless____/article/details/131786820

我们对 对象相等 的定义是:当两个对象 equals 返回 true 时,则两个对象就是相同的

但是当两个对象不相等时,可能会得到相同的哈希值

哈希表存储的原理:

  • 通过哈希值计算出存储的位置,如果该位置为null,则直接存入;
  • 如果不为null,则调用equals方法(不为null说明多个对象的哈希值相等,但是哈希值相等不代表元素相等,元素是否相等的标准由equals判断),如果该位置存在equals为true的元素,则不存储,如果没有则存储(以链表或红黑树的形式存储)

所以从上面看出,哈希值具有两个作用,一是计算出存储位置,二是初步判断哈希表中是否存在相同元素

正是因为哈希表具有不存储相同对象的特点,HashSet才能做到不重复

又因为哈希表是数组+链表+红黑树,并且不是从索引0开始按序存储,所以HashSet是无序的、无索引的

如下图,在遍历的时候,会先查看0索引位置,没有元素,那么查看1索引位置,遍历该链表,继续查看2索引位置... 以此类推,因此遍历的结果是 黄 -> 橙 -> .. -> 深蓝 -> 浅蓝 ,而我们存储的顺序可能是 橙 -> 浅蓝 -> ... -> 蓝->黄

LinkedHashSet

本质上跟 HashSet 相同,只不过多了个双链表的机制记录储存的顺序

现在我们要将这四个元素存入哈希表中

 现在存入第一个元素,此时还有一条双向链表,双向链表的头结点指向该元素

存入第二个元素,此时,第一个元素会记录下第二个元素的地址值,第二个元素也会记录第一个元素的地址值,这就形成了一个双向链表

存入第三个元素,第三个元素和第四个元素间同样会相互记录地址值

 存入第四个元素

接下来要遍历的时候,不再和HashSet相同,而是直接从头节点开始遍历该双向链表,最后得到的结果就是有序的

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

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

相关文章

GitHub 上都有哪些值得关注学习的 javascript开源项目?

前言 下面是我整理的一些关于GitHub上的js的相关的项目,希望对你有所帮助 实用工具向 1.Exchart Star:55.6k Exchart提供了大量精美的图表,只有你想不到,没有你在它上面找不到的,同时点进相应的图标后便可以在线对它…

SpringCloud系列:负载均衡组件-Ribbon

作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387… | 知乎:www.zhihu.com/people/1024… | GitHub:github.com/JiangXia-10… 本文一共4529字,预计阅读12分钟 前言 前面几…

【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

音频驱动嘴形之CodeTalker

论文发版:CVPR2023 应用: Over the discrete motion space, a temporal autoregressive model is employed to sequentially synthesize facial motions from the input speech signal, which guarantees lip-sync as well as plausible facial expres…

TOWE智能PDU是如何帮助机房安然度夏的?

最近,全国各地纷纷进入高温“火炉”模式,炎炎夏日,数据中心的工作温度不应该超过一定的限度。数据中心机房不仅要确保在高温多雨天气下安全、稳定的运维,还要承受降低企业总体运营成本的压力。这种需求下,相较于传统基…

【C++修炼之路】类和对象(下)—— 完结篇

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录 一、再谈构造函数1、初始化列表2、explicit 关键字 二、static 成员1、概念2、特性 三、友元1、友元函数2、友元类 四、内部类五…

C++笔试常用函数整理

数组 #include <vector> push_back&#xff1a;向量尾部增加一个元素 pop_back&#xff1a;删除向量中最后一个元素 empty&#xff1a;判断向量是否为空&#xff0c;若为空&#xff0c;则向量中无元素 size : 输出队列中数据元素的个数 vector初始化相关&#xff1a…

Java使用poi-tl1.9.1生成Word文档的几个小技巧

目录 前言 一、poi-tl简介 1、什么是poi-tl 2、常见的word生成对比 3、poi-tl功能点 二、poi-tl文档生成 1、模板准备 2、目标参数填充 3、生成效果 三、可能会遇到的问题 1、混合图表生成报错 2、图表参数设置技巧 总结 前言 也许在您的工作当中会碰到如下的一些场景…

python和django中安装mysqlclient失败的解决方案

在Pychram中和pip中安装mysqlclient都不成功&#xff0c;只能直接下载二进制包进行安装了&#xff0c;下载页面中根据python的版本选择对应WHL包下载&#xff0c;下载地址 mysqlclient PyPIhttps://pypi.org/project/mysqlclient/#files 通过pip命令进行安装 pip install d:\…

基于javascript的简单拖拽排序

基于javascript的简单拖拽排序 效果示例图代码示例 效果示例图 代码示例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing:…

网工内推 | 数通网工专场,HCNP/CCNP认证优先

01 天津海展会议展览有限公司 招聘岗位&#xff1a;网络工程师&#xff08;数通方向&#xff09; 职责描述&#xff1a; 1、负责企业整体网络架构的设计、优化、部署及网络运维管理体系的的构建&#xff1b; 2、负责企业内网、外网、有线侧、无线侧网络策略的配置及调优&…

虚拟主播动捕设备,满足不同应用领域的3d虚拟主播直播需求

随着移动互联网的普及&#xff0c;直播行业迅速发展&#xff0c;用户规模持续上升&#xff0c;一度成为平台经济领域的中流砥柱&#xff0c;其中虚拟主播成为了直播赛道中一种新的内容形式。 3d虚拟主播是通过计算机生成的数字人&#xff0c;它们可以在直播中通过虚拟主播动捕…

Vue成绩案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能

一、成绩案例 ✅✅✅通过本次案例实现添加、删除、显示无数据、添加日期、总分均分以及数据本地化等功能。 准备成绩案例模板&#xff0c;我们需要在这些模板上面进行功能操作。 <template><div class"score-case"><div class"table">…

材料学博士生CSC资助德国联陪归来谈体会

作者许潇洒&#xff0c;为西北工业大学材料学院材料学专业博士研究生&#xff0c;受CSC高水平大学公派研究生项目&#xff0c;于2022年至2023年赴德国德累斯顿工业大学开展了为期12个月博士联合培养学习。访学归来&#xff0c;其撰文谈感受&#xff0c;知识人网小编转载如下&am…

润和软件与华秋达成生态共创合作,共同推动物联网硬件创新

7月11日&#xff0c;在2023慕尼黑上海电子展现场&#xff0c;江苏润开鸿数字科技有限公司(以下简称“润开鸿”)与深圳华秋电子有限公司(以下简称“华秋”)签署了生态共创战略合作协议&#xff0c;共同推动物联网硬件生态繁荣发展。当前双方主要基于润开鸿的硬件产品及解决方案开…

如何通过smardaten无代码开发平台快速搭建数据中台?

目录 一、数据中台是什么&#xff1f;二、数据中台的特点1、数据中台需要具备哪些特性&#xff1f;2、数据中台需要提供哪些服务&#xff1f; 三、数据中台搭建工具四、如何用无代码快速搭建数据中台1、多源数据接入2、数据流&#xff08;数据集成&#xff09;3、数据资产管理4…

el-table刷新后保持高亮并改变状态字段

一、需求&#xff1a; 1、点击左侧右边显示具体内容 2、点击右边确认 左侧依旧高亮并且改变启动状态颜色 3、点击刷新、重置、高级搜索等不高亮 右边也不显示具体内容 二、效果图&#xff1a; 三、具体实施 1、定义highlight-current-row 是否高亮行 <el-table ref&quo…

opencv -13 掩模

什么是掩膜&#xff1f; 在OpenCV中&#xff0c;掩模&#xff08;mask&#xff09;是一个与图像具有相同大小的二进制图像&#xff0c;用于指定哪些像素需要进行操作或被考虑。掩模通常用于选择特定区域或进行像素级别的过滤操作。 OpenCV 中的很多函数都会指定一个掩模&…

数据结构链表,结点的结构体定义以及增删改查的实现

一、单链表的定义和表示 线性表链式存储结构的特点是&#xff1a;用一组任意的存储单元存储线性表的数据元素&#xff08;这组存储单元可以是连续的&#xff0c;也可以是不连续的&#xff09;。因此&#xff0c;为了表示每个元素与其直接后继数据元素之间的逻辑关系&#xff0…

基于G6的弓字形流程图

需求 现在有个需求是类似于步骤条、流程图&#xff0c;但是节点比较多。 搜了很多类似组件&#xff0c;还是有各种问题。 尝试过的已有组件 一开始用的是element-ui自带的步骤条组件&#xff08;下图所示&#xff09;&#xff0c;但是节点过多&#xff0c;宽度不够的时候&am…