HashSet集合添加元素的过程

2023-11-11

HashSet底层为数组+链表存储数据,根据元素的哈希值确定元素在数组中存储的位置,当哈希值一样时,调用equals()方法,当为true时,则表明数据一样,否则不一样。
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法计算获取到元素a的哈希值,此哈希值再通过散列函数计算出在HashSet底层数组中存储的位置(索引位置)。判断数组在此位置上是否存存在元素:
情况一:如果此位置上没有其他元素,则直接添加元素a,添加成功。
情况二:如果此位置上存在其他元素b(或者以链表形式存在多个元素),则比较元素a和元素b的哈希值,如果哈希值不同,则直接添加元素a,元素添加成功。
情况三:如果哈希值相同,进而调用元素a和元素b所在类的equals()方法,如果equals()方法返回true,则表明元素a和元素b相同,添加失败,当equals()方法返回false,则表明不同,添加成功。
在添加元素成功后,如果数组此位置上还存在元素,再来新的元素则以链表的形式存储。
JDK7:新来的元素放在数据中,指向数据此处原来的元素。
JDK8:数组原来的元素在数组中,指向新的元素。
简称:七上八下
对于存放在Set容器中的对象,对象对应的类一定要重写equals()和hashCode()方法,以实现对象相等规则,即:相等的对象必须具有相等的散列码。HashSet底层也是数组,初始化长度为16,当使用率超过0.75,就会扩大容量为原来的2倍。
创建hashSet,其实底层创建的是:HashMap<>();
public HashSet() {
  map = new HashMap<>();
}
LinkedHashSet:作为HashSet的子类,在添加数据时,每个数据维护了两个引用,记录了此数据的前一个数据和后一个数据。优点:遍历效率高,要高于HashSet。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HashSet集合添加元素的过程 的相关文章

随机推荐

  • uboot命令使用学习(2)

    学习目标 uboot命令使用学习 2 学习内容 学习使用了正点原子的I MX6ULL教程及开发平台 使用uboot的内存操作命令 直接对DRAM进行读写操作 1 md 2 nm 3 mm 4 mw 5 cp 6 cmp 学习时间 2022
  • CVPR 2022 论文列表(持续更新)

    本文包括论文链接及代码 关注公众号 AI基地 及时获取最新资讯 学习资料 GitHub链接 GitHub gbstack cvpr 2022 papers CVPR 2022 papers with code 因为CSDN的markdown
  • Unity中Pivot和Center的区别与应用

    Pivot指的是轴心 是模型在建模软件中构建时指定的 可以在建模软件中进行更改 如果选择了场景中的多个物体的话 则坐标是第一个选中的物体的Pivot坐标 Center指的是中心 是在Unity中根据模型的mesh信息计算得到的中心位置 是所
  • QML学习二:Doxygen为qml工程生成代码文档

    效果如下 设置后能够支持 js和 qml文档 QML学习二 Doxygen为工程生成注释文档 前言 一 安装doxyqml 二 Doxygen设置 1 文档目录设置 2 文档目录设置 三 添加注释 总结 前言 好的代码必须配一个好的文档说明
  • linux named dns中继,菜鸟linux DNS搭建问题,请指教

    下面是相关配置文件内容 ip为192 168 247 168 root localhost named root localhost named root localhost named cat etc resolv conf Genera
  • KEGG_cnetplot绘制基因—通路图(展示想要的通路)——R

    以KEGG富集结果为例 首先进行KEGG富集分析 library clusterProfiler de ekp lt enricher gene TERM2GENE pathway2gene TERM2NAME pathway2name p
  • 多路转接IO/多路复用 select 、poll、 epoll

    多路转接IO 1 多路复用 多路转接 2 作用 I0多路转接可以完成大量描述符的监控 监控的事件 可读事件 可写事件 异常事件 3 当使用多路转接的时候 多路转接接口发现了某一一个文件描述符就绪的时候 就会通知进程 让进程针对某一个描述符进
  • Qt安装教程

    Qt 实际上是一个 C 的桌面图形窗口类库 就是一些 lib 跟 dll 只要把这些 类库引入自己的项目 就能调qt类库做一些操作 例如创建窗口 所以你可以把 这些 qt 的 类库配置在 vs2019 clion 里面使用都是可以的 Qt
  • numpy回忆

    numpy对矩阵操作后 输出的形状与想象的不一样 记个笔记代码 点乘的padding操作容易出错 开发时间 4 24 import numpy as np Data np array 1 2 255 255 0 255 255 0 0 3
  • 墨刀使用笔记

    一 拖动的集中方式 1 按住空格键拖动 2 按住鼠标中间键拖动 3 永久拖动 按住空格键 Alt a 注 必须启动微信 按住空格键拖动即可取消永久拖动
  • wind10生成 SSH 公钥---实现github本地部署、上传

    wind10生成 SSH 公钥 实现github本地部署 上传 1 Git 生成 SSH 公钥 如前所述 许多 Git 服务器都使用 SSH 公钥进行认证 为了向 Git 服务器提供 SSH 公钥 如果某系统用户尚未拥有密钥 必须事先为其生
  • Java的常考问题

    Java的垃圾回收机制 http www importnew com 26821 html https www cnblogs com andy zcx p 5522836 html Java语言支持的8种基本类型是 整数型 byte sh
  • vue路由history模式刷新404问题解决方案

    server listen 8888 默认端口是80 如果端口没被占用可以不用修改 server name localhost root E vue my project dist vue项目的打包后的dist location try f
  • 2021-08-12c++考试题目

    一 选择题 每题3分 1 关于虚函数 正确的描述是 A 构造函数不能是虚函数 B 析构函数不能是虚函数 C 虚函数可以是友元函数 D 虚函数可以是静态成员函数 2 在32位操作系统g 编译器环境下 下面程序的运行结果为 1 2 3 4 5
  • Servlet线程安全吗?

    Servlet不是线程安全的 要解释为什么Servlet为什么不是线程安全的 需要了解Servlet容器 即Tomcat 使如何响应HTTP请求的 当Tomcat接收到Client的HTTP请求时 Tomcat从线程池中取出一个线程 之后找
  • 伏秒平衡

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 相关介绍 伏秒值就是伏秒积 即电感两端的电压V和这段时间T的乘积 顾伏秒值也通常称作为伏秒积 伏秒平衡 一般用在开关电路 伏秒积平衡没有要求一定是恒压源激励 电感两端电压是
  • bs4爬取网页图片

    最近学习爬虫 利用bs4批量爬取图片 由于每个父链接点进去的子链接命名格式不一样 所以暂时没有找到把所有父链接下子链接图片全部下载的方法 只是下载了每个父链接点进去的第一个子链接图片 import requests from bs4 imp
  • DataGrip简单特性介绍和navicat作简单对比

    本文主要是面向学生或者初学者的 DataGrip 版本 2020 2 Navicat版本 Navicat for mysql V11 2 以下只是本人简单的使用感受 没有指标上 性能上 的测试 可能有很多点是自己摸索不到从而产生误会 请各位
  • mysql delete 与drop_MySQL中 delete和drop的区别

    DELETE命令的简单介绍 DELETE是一种数据操作语言 DDL 命令 可以使用DELETE命令来从表中删除部分或全部记录 可以和WHERE子句一起使用 用于删除满足添加的某些记录 如果未指定WHERE条件 则将删除所有记录 相关视频教程
  • HashSet集合添加元素的过程

    HashSet底层为数组 链表存储数据 根据元素的哈希值确定元素在数组中存储的位置 当哈希值一样时 调用equals 方法 当为true时 则表明数据一样 否则不一样 我们向HashSet中添加元素a 首先调用元素a所在类的hashCode