HashSet和HashMap内部结构分析

首先明确一点:HashSet的底层就是HashMap

HashSet与HashMap的不同点:

HashMap存储的是键值对(也就是key-value),即在调用HashMap的put方法时传入的两个值,而HashSet其实也是存储的键值对,但是键值对的value是一个默认值(PRESENT,一个Object的对象)

HashSet的方法也只能将key取出,不能取出value,而HashMap就有方法能将value也取出

既然说HashSet的底层是HashMap,那来看看源码:

来看看HashSet的add方法源码:

 

 map是什么?

可以看到map是HashSet这个类的属性,这个属性是HashMap的一个对象,这样就可以通过这个map对象来调用HashMap的方法

 果然:

用map调用了HashMap的put方法,这就是为什么说HashSet的底层使用的是HashMap,很多方法都是直接调用HashMap的方法,比如remove

接着讲add方法

put方法传入了两个值,一个是你自己输入的(e),一个是默认值,也就是刚才说的PRESENT

HashSet要添加数据调用的是add方法,而HashMap添加数据调用的是put方法,实际add方法也是调用的HashMap的put方法,这一点可以从上面源码看出;

我们再来通过put方法分析HashMap的内部结构(内部类,内部接口)

进入put方法

put方法有调用的putVal方法

 putVal方法里面又调用的hash方法,hash方法是通过传入的key值来计算hash值,来确定键值对在table表中的位置,table表就是一个数组,这个数组存放的就是键值对(HashMap$Node类型),为什么table数组存放的是HashMap$Node类型的数据?马上就有解释

进入putVal方法:

这一堆代码就是添加数据的底层源码了,我只分析内部结构 

可以看到这里有个table,这就是刚才说的table数组,键值对都存储在这个数组里面 

看一下table的定义:是一个Node类型的数组,那Node又是什么呢?

 

 Node就是HashMap的内部类

 这里有个newNode方法:

 newNode方法就是调用Node这个内部类的构造器创建了一个Node对象,并返回,再将这个对象放入table数组里

 这里就是为什么table数组的类型是HashMap$Node类型的原因了,还记不记得,new一个内部类,这个新new出来的对象其实是一个新匿名内部类的对象,这个匿名内部类的名字系统分配的规则就是外部类名+ $ + 内部类名,原理相当于  HashMap(外部类)$Node(内部类) extends Node(内部类)  ,所以用Node是新类的父类,用Node去接收是没问题的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器镜像怎么选?操作系统版本选择说明

阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云百科来详细说下阿里云服务器操作系统有哪些&#xf…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置(Matlab代码实现)

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

从爆火的“哇呀挖”,思考我软件开发的人生意义何在?

【 在什么样的花园里面,挖呀挖呀挖,种什么样的种子,开什么样的花,在小小的花园里面,挖呀挖呀挖,种小小的种子,开小小的花,在大大的花园里面,挖呀挖呀挖,种大大…

国内GPU渲染农场有哪些值得推荐?

GPU凭借它在图形渲染领域强大的架构和计算能力,给广大用户带来了一种更为高效的解决方案,我们启用GPU渲染加速,实际就是调用GPU加速图形的渲染和填充。既然聊到GPU渲染,CG行业的朋友们肯定也好奇国内值得推荐的GPU渲染农场有哪些&…

​射频PCB 设计​的六大条技巧

即使是最自信的设计人员,对于射频电路也往往望而却步,因为它会带来巨大的设计挑战,并且需要专业的设计和分析工具。这里将为您介绍六条技巧,来帮助您简化任何射频PCB 设计任务和减轻工作压力! 1、保持完好、精确的射频…

Android网络代理原理及实现

网络代理简介 代理典型的分为三种类型: 正向代理 缓存服务器使用的代理机制最早是放在客户端一侧的,是代理的原型,称为正向代理。其目的之一 是缓存,另一目的是用来实现防火墙(阻止互联网与公司内网之间的包&#x…

第十二章_Redis单线程 VS 多线程

Redis为什么选择单线程? 是什么 这种问法其实并不严谨,为啥这么说呢? Redis的版本很多3.x、4.x、6.x,版本不同架构也是不同的,不限定版本问是否单线程也不太严谨。 1 版本3.x ,最早版本,也就是大家口口相…

Day965.从持续集成到持续部署 -遗留系统现代化实战

从持续集成到持续部署 Hi,我是阿昌,今天学习记录的是关于从持续集成到持续部署的内容。 只有做好任务分解和小步提交,才能放心大胆地 PUSH 代码,触发持续构建; 只有通过质量门禁,才能得到一个有信心的制…

( 位运算 ) 268. 丢失的数字 ——【Leetcode每日一题】

❓268. 丢失的数字 难度:简单 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1: 输入:nums [3,0,1] 输出:2 解释:n 3,因为有 3 个数…

干货分享|一款让企业知识管理变得简单高效的工具软件

互联网发展到下半场,很多企业都开始进行数字化转型,在这个过程中,很多企业都忽视了极为重要的一点——企业的知识管理。如今信息化的时代,可以说企业的知识管理是引领企业数字化转型、进行创新的关键。 企业知识管理的实质就是对…

视频文本检索之CLIP4Clip

论文:CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval GitHub:https://github.com/ArrowLuo/CLIP4Clip 学习是一种行动反射, 不是为了晓得些“知识”, 要切己体察,代入自己&#xff0c…

mid360激光雷达跑Point-LIO算法

在商场里面上下楼穿梭,使用mid360激光雷达,完成建图 以下是建图的运行过程及参数配置 mid360激光雷达驱动 安装(ubuntu20.4 ) /ws_livox/src/livox_ros_driver2$source /opt/ros/noetic/setup.sh /ws_livox/src/livox_ros_driver2$./build.sh ROS1配置修改MID360_confi…

可拓展哈希

可拓展哈希 借CMU 15445的ppt截图来说明问题。 我们传统静态hash的过程是hash函数后直接将值存入对应的bucket,但是在可扩展hash中,得查询Directory(左),存入directory指向的bucket(右)。 下面…

ASEMI代理ADI亚德诺LTC6992IS6-1#TRMPBF车规级芯片

编辑-Z LTC6992IS6-1#TRMPBF参数描述: 型号:LTC6992IS6-1#TRMPBF 输出频率:3.81Hz 工作电源电压范围:2.25 - 5.5V 通电复位电压:1.95V 电源电流:105-365A SET引脚处的电压:1V 频率设置电…

物联网|IAR集成开发环境简介|cc254核心板硬件资源|物联网之蓝牙4.0 BLE基础-学习笔记(3)

文章目录 4、IAR集成开发环境简介5、 cc254核心板硬件资源 4、IAR集成开发环境简介 完整稳定的专业嵌入式开发环境,对不同的处理器有统一的用户界面,支持35种以上的MCU,包括8,16,32位, 完全兼容C语言的 高…

FPN和PAN的内容及区别

FPN和PAN都是用于解决在目标检测中特征金字塔网络(FPN)在多尺度检测任务上的不足的方法。下面分别详细介绍一下它们的原理和区别。 FPN FPN全称Feature Pyramid Network,是由FAIR在2017年提出的一种处理多尺度问题的方法。FPN的主要思路是通过构建金字塔式的特征图…

【CSS系列】第四章 · CSS字体属性

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

人机智能中几个困难问题浅析

1、人机之间与人人之间信任的区别人机之间的信任与人人之间的信任存在以下异同:①信任对象。人机之间的信任的对象是计算机系统、算法、机器人等,而人人之间的信任的对象是其他人。②信任方式。人机之间的信任是基于技术、安全协议等建立的,例…

【Linux网络】传输层中UDP和TCP协议

文章目录 1、再谈端口号2、UDP协议3、TCP协议3.1 TCP协议段格式3.2 TCP的三次握手和四次挥手(连接管理机制)3.3 TCP的滑动窗口3.4 TCP的流量控制3.5 拥塞控制3.6 延迟应答和捎带应答3.7 面向字节流和粘包问题3.8 TCP总结 1、再谈端口号 端口号port标识一…

2023年前端面试题汇总-代码输出篇

1. 异步 & 事件循环 1. 代码输出结果 const promise new Promise((resolve, reject) > {console.log(1);console.log(2); }); promise.then(() > {console.log(3); }); console.log(4); 输出结果如下: 1 2 4 promise.then 是微任务,它…