当前位置: 首页 > news >正文

HashSet原理

HashSet原理

  • HashSet原理
    • 1.概述
    • 2.底层代码
    • 3.原理图解
    • 4.总结
      • 4.1: 1.7原理总结
      • 4.2: 1.8原理总结

HashSet原理

1.概述

​ HashSet 实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的 迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

2.底层代码

​ HashSet 它是基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存 所有元素,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底 层 HashMap 的相关方法来完成

public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
{static final long serialVersionUID = -5024744406713321676L;// 底层使用hashmap来保存hashset中所有的元素private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Map// 定义一个虚拟的object对象作为hashmap的value,将次对象定义为static final,放在map的值的位置private static final Object PRESENT = new Object();// 默认无参构造,实际底层初始化一个空的hashmap,并使用默认初始容量为16和加载因子为0.75public HashSet() {map = new HashMap<>();}// 构造一个指定Collection中元素的新set,实际底层使用默认的加载因子为0.75和足以包含指定Collection中	// 左右元素的初始容量来定义一个hashmappublic HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}// 以指定的initialCapacity和loadFactor构造一个空的set,实际底层以相同的参数,构造一个空的map集合// initialCapacity:初始容量,loadFactor:加载因子public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}// 指定初始长度创建一个空的集合,实际使用一样的参数,与加载因子为0.75构造一个空的mappublic HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}// 指定初始长度和加载因子构造一个新的空链接哈希集合// 此构造函数为包含访问权限,不对外公开,实际只是对LinkedHashSet的支持// 实际以指定的参数创建一个空的LinkedHashMap集合HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}

3.原理图解

hashset1.7原理

hashset1.8原理

hashset1.8元素存储

4.总结

4.1: 1.7原理总结

  1. 底层结构:哈希表.(数组+链表)
  2. 数组的长度默认为16,加载因子为0.75
  3. 首先会先获取元素的哈希值,计算出在数组中应存入的索引
    1. 判断该索引处是否为null
    2. 如果是null,直接添加
    3. 如果不是null,则与链表中所有的元素,通过equals方法进行比较属性值只要有一个相同就不存入,如果都不一样,就存入.

4.2: 1.8原理总结

  1. 底层结构:哈希表.(数组+链表+红黑树)
  2. 当挂在下面的元素过多,那么不利于添加,也不利于查询,所以在1.8之后
  3. 当链表长度超过8的时候,自动转换为红黑树
  4. 存储流程不变.

对于hsahset中保存对象,一定注意正确重写equals和hsahcode方法,以保证存入的对象唯一性.

相关文章:

HashSet原理

HashSet原理HashSet原理1.概述2.底层代码3.原理图解4.总结4.1: 1.7原理总结4.2: 1.8原理总结HashSet原理 1.概述 ​ HashSet 实现 Set 接口&#xff0c;由哈希表&#xff08;实际上是一个 HashMap 实例&#xff09;支持。它不保证 set 的 迭代顺序&#xff1b;特别是它不保证…...

【C#进阶】C# 特性

序号系列文章10【C#基础】C# 正则表达式11【C#基础】C# 预处理器指令12【C#基础】C# 文件与IO文章目录前言1&#xff0c;特性的概念1.1 特性的属性1.2 特性的用途2&#xff0c;特性的定义2.1 特性参数2.2 特性目标3&#xff0c;预定义特性3.1 AttributeUsage3.2 Conditional3.2…...

Java速成篇-Day01笔记

提示&#xff1a;这里只记录我个人不熟悉的知识&#xff0c;并非所有内容 笔记目录课程&#xff1a;04-第一行代码① jshell② 对象.方法课程&#xff1a;05-第一份源码① Java开发程序的流程② 入口方法课程&#xff1a;06-常见问题-中文乱码① 乱码原因② 解决方法课程&#…...

从源码开始精通spring-security1

参考b站up主&#xff1a;传送门 前沿: 本章&#xff1a;spring-security 重要的成员 WebSecurity、HttpSecurity、SecurityBuilder、SecurityFilterChain、FilterChainProxy 重点&#xff1a;WebSecurity、HttpSecurity 他们都实现了 SecurityBuilder 接口 用来构建对象 WebSe…...

你应该优化的JavaScript代码,以及前端工程师日常使用的小技巧。使之更加简洁,可读性更强,更易维护。

本文主要是分享一下平时前端工程师&#xff0c;在写前端代码过程中的一些代码优化&#xff0c;以及使用的一些小技巧&#xff0c;来使我们的代码更加简洁&#xff0c;可读性更强&#xff0c;更易维护。 1. 字符串的自动匹配&#xff08;includes的优化&#xff09; includes是…...

自动化测试

文章目录前言一、什么是自动化测试&#xff1f;一个简单的自动化实例二、自动化测试的分类1.接口自动化测试2.UI自动化测试&#xff08;界面测试&#xff09;移动端自动化测试web端自动化测试&#xff08;主要学习&#xff09;三、selenium工具1.为什么选择selenium作为web自动…...

leetcode-每日一题-807(中等,数组)

正常情况第一眼看这道题&#xff0c;看懂意思的话很简单就可以解出来。给你一座由 n x n 个街区组成的城市&#xff0c;每个街区都包含一座立方体建筑。给你一个下标从 0 开始的 n x n 整数矩阵 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。城市的…...

【Linux】Linux项目自动化构建工具make makefile

文章目录1. 背景2.实例3.原理4.项目清理5. 文件属性中的三个时间6. Linux下第一个小程序——进度条6.1 前置知识1&#xff1a;缓冲区6.2前置知识2&#xff1a;回车换行6.3进度条的实现7 Linux下git的”三板斧“1. 背景 一个工程中的源文件不计其数&#xff0c;其按类型、功能、…...

华为OD机试题 - IPv4 地址转换成整数(JavaScript)| 含思路

华为OD机试题 最近更新的博客使用说明本篇题解: IPv4 地址转换成整数题目输入输出示例一输入输出说明示例一输入输出说明Code解题思路华为OD其它语言版本最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | …...

spring整合通用mapper

1.使用通用mapper可以更快速的进行数据库的增删查改操作,加入springboot的管理,常规的SQL都可以复用 2.整合  a)引入依赖 <dependencies><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId>…...

一天什么时间发抖音浏览量高?5个抖音最佳发布时间段

抖音作为现在一款现象级的软件&#xff0c;已经不知不觉地影响着我们生活的方方面面。那抖音想要被更多人看到&#xff0c;就需要掐准哪些时间活跃数最多&#xff0c;今天就来和大家分享一下一天什么时间发抖音浏览量高&#xff0c;又该如何抓住最佳投放契机呢?一、一天什么时…...

华为OD机试题 - 关联子串(JavaScript)| 含思路

华为OD机试题 最近更新的博客使用说明本篇题解:关联子串题目输入输出示例一输入输出说明示例二输入输出说明Code解题思路华为OD其它语言版本最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典...

【代码随想录训练营】【Day33休息】【Day34】第八章|贪心算法|1005.K次取反后最大化的数组和|134. 加油站|135. 分发糖果

K 次取反后最大化的数组和 题目详细&#xff1a;LeetCode.1005 这道题比较简单&#xff0c;这里直接给出贪心策略&#xff1a; 局部最优解&#xff1a; 按照 负数 > 0 > 正数 的优先级次序&#xff0c;依次对nums中的较小数值进行取反因为负负得正&#xff0c;负值越小…...

<c++> const 常量限定符

文章目录什么是 const 常量限定符const 的初始化const 的默认作用域const 的引用例外情况const 与指针const指针的声明指向 const 的指针const指针指向 const 的 const指针什么是 const 常量限定符 Q&#xff1a;什么是 const 常量限定符&#xff1f; A&#xff1a;const名叫常…...

pytorch实现transformer模型

Transformer是一种强大的神经网络架构&#xff0c;可用于处理序列数据&#xff0c;例如自然语言处理任务。在PyTorch中&#xff0c;可以使用torch.nn.Transformer类轻松实现Transformer模型。 以下是一个简单的Transformer模型实现的示例代码&#xff0c;它将一个输入序列转换为…...

【懒加载数据 Objective-C语言】

一、咱们就开始进行懒加载 1.懒加载发现,每一个字典,是不是就是四个键值对组成的: 1)answer:String,中国合伙人, 2)icon:String,movie_zghhr, 3)title:String,创业励志电影, 4)options:Array,21 items 前三个都是String类型,最后是不是Array类型, 所…...

人脸网格/人脸3D重建 face_mesh(毕业设计+代码)

概述 Face Mesh是一个解决方案&#xff0c;可在移动设备上实时估计468个3D面部地标。它利用机器学习&#xff08;ML&#xff09;推断3D面部表面&#xff0c;只需要单个摄像头输入&#xff0c;无需专用深度传感器。利用轻量级模型架构以及整个管道中的GPU加速&#xff0c;该解决…...

JMeter 控制并发数

文章目录一、误区二、正确设置 JMeter 的并发数总结没用过 JMeter 的同学&#xff0c;可以先过一遍他的简单使用例子 https://blog.csdn.net/weixin_42132143/article/details/118875293?spm1001.2014.3001.5501 一、误区 在使用 JMeter 做压测时&#xff0c;大家都知道要这么…...

git常用命令汇总

Git 是一种分布式版本控制系统&#xff0c;它具有以下优点&#xff1a; 分布式&#xff1a;每个开发者都可以拥有自己的本地代码仓库&#xff0c;不需要连接到中央服务器&#xff0c;这样可以避免单点故障和网络延迟等问题。 非线性开发&#xff1a;Git 可以支持多个分支并行开…...

【2023】华为OD机试真题Java-题目0226-寻找相似单词

寻找相似单词 题目描述 给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。 相似单词说明:给定一个单词X,如果通过任意交换单词中字母的位置得到不同的单词Y,…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...