HashSet和HashMap内部结构分析

news/2024/11/17 1:28:51/

首先明确一点: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去接收是没问题的


http://www.ppmy.cn/news/60057.html

相关文章

GreatSQL社区首款开源工具亮相丨数据校验修复工具gt-checksum开源啦!

背景介绍功能特性gt-checksum使用 3.1 标准使用案例 3.2 直接在命令行模式下使用 3.3 使用极简配置文件案例项目信息 经过两年多的努力,GreatSQL社区首款数据校验工具——gt-checksum近期正式开源啦~ gt-checksum 作为GreatSQL社区新增的成员,是一款静态…

JQuery实现自定义滚动条

在页面中虽然可以通过CSS修改滚动条的样式,但是部分属性是无法自己修改和设置的,而且不同浏览器存在兼容问题,因此通过JS来实现滚动条在自定义滚动条的环境下也是有必要的。 接下来,我们来实现上图两种情况下滚动条的实现。 一、页面搭建 1.…

Redis高级——批处理优化

2、批处理优化 2.1、Pipeline 2.1.1、我们的客户端与redis服务器是这样交互的 单个命令的执行流程 N条命令的执行流程 redis处理指令是很快的,主要花费的时候在于网络传输。于是乎很容易想到将多条指令批量的传输给redis 2.1.2、MSet Redis提供了很多Mxxx这样的…

跟着我学 AI丨让计算机看懂世界

计算机视觉是一种利用计算机和数学算法来处理、分析和识别数字影像的技术。这项技术在近年来得到了快速发展,应用范围也越来越广泛,它已经成为了人工智能领域中的重要分支之一。 技术原理 计算机视觉技术主要涉及图像处理、模式识别和机器学习等方面的技…

Java8中DateTimeFormatter真的是线程安全的吗?

文章目录 [toc] 1.背景2.解决办法2.1办法一:换姿势或者升级JDK的版本2.1办法二:更换文件名称字生成策略 Java8中DateTimeFormatter真的是线程安全的吗? 答案是否定的 1.背景 由于之前写了一个旷世的ocr的服务,接入了旷世的FaceID的人脸比对…

RN系统精讲-----基础了解

原生基础 安装SDK与Tools preference > appearance > systemSetting > Android sdk 如何连接设备,以及开发中的常用的adb命令 USB连接设备 adb devices 查看连接设备 wifi网络连接设备 adb connect ip(手机自己的ip地址,可以通过…

基于J2EE的B2C电子商务系统开发与实现

摘要 当今社会,科学技术突飞猛进,知识经济初见端倪。电子商务作为一种新型的贸易方式,极大地促进了全球经济贸易的发展,同时也正在改变人们的生活方式和思想观念。电子商务是指整个贸易活动实现电子化,交易各方以电子交易方式而进行的商业交易。世界贸易组织电子商务专题报告定…

python 统计pdf页数

python 统计pdf页数 import os import PyPDF2 import sys, jm, traceback from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QAction from PyQt5 import QtCore, QtGui, QtWidgets def get_all_file_by_type(path, type(), get_all_dirs True): # 获得以…