HashMap的底层原理
hashmap是一个以key,value形式存储的集合,在JDK1.7中是以数组+链表的数据结构,在JDK1.8中是数组+链表+红黑树的数据结构,他在对数据操作时继承了数组的线性查找和链表的寻址修改
hashmap是线程不安全的 :
- 在JDK1.7中会造成环形链和数据丢失的情况
- 在JDK1.8中hashmap的put过程会造成数据覆盖的情况
- put过程 :
- 会对key计算求hash值,判断是否发生哈希碰撞(计算出的哈希值相同)
- 发生了碰撞就放入bucket桶里面,没有发生哈希碰撞就以链表的形式链接到后面
- hashmap的存储过程 : 如果链表的长度大于8会转为红黑树,如果链表的长度小于6会从红黑树转为链表
- 然后就会去判断节点上是否有值 ,有值的话会覆盖旧值
- 如果桶满了会进行扩容2倍在重排
其实hashmap主要的目的就是存储数据结构的,查询的方式通过哈希算法计算的
首先他的结构组成分为 :
- 数组结构 :
- 他是采用一段连续的存储单元来存储数据的
- 查询 : 由于数组元素下标是连续且自增的所以在做查询时可以直接通过下标找到对应的节点,一般在查询频繁的场景下使用最多
- 增删 : 当插入一个元素时,这个元素在数组中是没有下标的,需要将元素添加到数组中的某个位置,那么在该元素之后的下标都会向后移动,以至于后面的节点也要有相应的改变,删除会造成下标向前移动
- ArrayList : 就是一个基于数组结构的集合,查询快,增删慢,
- 他还有一个扩容机制 : 它的默认容量是10,在使用ArrayList做增删时,他会创建一个新的数组且这个数组是原数组容量的1.5倍,并将原数组中的元素拷贝一份到新的数组中去,所以一般我们使用ArrayList做增删时需要指定它的容量
- 他是采用一段连续的存储单元来存储数据的
- 链表结构 :
- 链表是一种物理存储单元上非连续,非顺序的存储结构,它的特点是增删快,查询慢
- 查询 : 它的查询需要通过头节点将整个链表都遍历一次,以至于查询效率很慢
- 增删 : 新增时上一个节点指向插入的节点,插入的节点指向下一个节点;只需要去改变指针的指向就可以完成增删操作
- LinkedList : 是基于链表结构的,查询慢,增删快
- 链表是一种物理存储单元上非连续,非顺序的存储结构,它的特点是增删快,查询慢
哈希算法 :
- 哈希算法(不可逆的,幂等性的算法)也叫作散列算法,也就是把任意长度值(key)通过散列算法变换成固定长度的key(地址),通过这个地址进行访问的数据结构,他通过把关键码值映射到表中一个位置来访问记录,从而加快查找速度
- 将lies计算出来的ascii码相加
- 然后除以10取模
- 为什么不直接存储,要进行取模?
- 因为数组是采用一段连续的存储单元来存储数据的,直接存储的话值会很大,其中会浪费很多的空间,取模的目的就是为了节省内存空间
- 取模会出现的问题 :
- 会发生哈希冲突(哈希碰撞) :
- lies的值通过ascii码计算的总和
- foes的值通过ascii计算的总和
- lies和foes取模之后的值相同,虽然他两是不同的key,但是数组存同一个下标元素时会进行覆盖,这就是哈希碰撞
- 哈希碰撞解决方式 :
- 使用链表解决 : 根据链表的指针,可以让lies指向foes,让foes去匹配下标,如果匹配lies不相等,则去匹配下一个节点foes,最终找到这个foes
- 这也是JDK1.8中引入红黑树的原因 : hashmap的存取过程
- 创建一个hasdmap集合并指定它的容量
- 往集合中添加元素时,当容量不够,就只能把这个数据放到链表上,链表是无线延长的,又因为链表的查询速度是比较慢的,那么哈希冲突也就会变得十分严重,查询末端数据的性能也就会变得很低(总结 : jdk1.7的hashmap需要解决链表过长查询效率低下的问题)
- 在jdk1.8中 : 使用红黑树去判断小中大(也就是左边的小于右边的),他的插入速度慢,而链表插入快,删除快
- 会发生哈希冲突(哈希碰撞) :
- 取模会出现的问题 :
- 因为数组是采用一段连续的存储单元来存储数据的,直接存储的话值会很大,其中会浪费很多的空间,取模的目的就是为了节省内存空间
- 为什么不直接存储,要进行取模?
相关文章:
HashMap的底层原理
hashmap是一个以key,value形式存储的集合,在JDK1.7中是以数组链表的数据结构,在JDK1.8中是数组链表红黑树的数据结构,他在对数据操作时继承了数组的线性查找和链表的寻址修改 hashmap是线程不安全的 : 在JDK1.7中会造成环形链和数据丢失的情况 在JDK1.8中hashmap的put过程会造…...

Django 4.0文档学习(四)
上篇文章 Django 4.0文档学习(四) 文章目录编写你的第一个 Django 应用,第 6 部分自定义应用的界面和风格编写你的第一个 Django 应用,第 7 部分自定义后台表单自定义后台更改列表自定义后台界面和风格自定义后台主页编写你的第一…...
2023年全国最新高校辅导员精选真题及答案38
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 112.为改变重知识传授轻能力培养的大学课堂,教学方法可以采用(&am…...

和ChatGPT-4聊完后,我觉得一切可能已经来不及了
了然无味,晴空万里!和ChatGPT-4开始了一场坦诚的沟通,它全程都表现出高情商,以及不断尽量安抚我的情绪,而这,恰恰令我脊背发凉。 部分文字截取 ZM:我能不能理解每次对话就是一次你的“生命” G&…...
RocketMQ 5.1 NameServer 启动流程
文章目录1 解析命令行参数和配置文件2 创建并启动 NamesrvController2.1 创建 NamesrvController 对象2.2 启动 NamesrvController 对象第一步:初始化 controller第二步:注册 JVM 钩子第二步:启动 controllerRocketMQ是一个分布式消息中间件&…...

马云回国,首谈ChatGPT
马云今天回国了,这是一个备受关注的消息。 作为中国最具代表性的企业家之一,马云在过去的二十多年里,带领阿里巴巴从一个小小的创业公司,发展成为全球最大的电商平台之一,同时也推动了中国互联网行业的发展。 他的回…...
深入理解C++迭代器:让你的C++代码更加灵活
C迭代器:更加优雅的容器操作方式引言C迭代器简介a. 迭代器的定义b. 迭代器的作用c. 迭代器与指针的区别迭代器分类a. 输入迭代器(Input Iterator)b. 输出迭代器(Output Iterator)c. 前向迭代器(Forward Ite…...

Java 读取Excel模板中的数据到实体类
目录一. 前提条件1.1 需求1.2 分析二. 准备2.1 自定义注解2.2 封装Excel的实体类三. 前台四. Controller层五. Service层💪💪💪六. 效果一. 前提条件 1.1 需求 从指定的Excel模板中读取数据,将读取到的数据存储到数据库中。 1.2…...

【java基础】Socket网络编程
文章目录说明InetAddress介绍Socket介绍ServerSocket介绍实现简单的Socket通信总结说明 这里介绍下如何在java里面进行socket编程 InetAddress介绍 这个类表示一个Internet协议(IP)地址,我们可以通过ip或者主机名来构建这个类 Testpublic void t1() throws Except…...

转发和重定向区别
转发和重定向 1.0 面试提问 定义不同跳转的方式不同数据共享不同最终的URL地址不同代码实现不同 1. 转发 1.1 概念 转发实际上在服务器端进行页面的跳转操作,请求转发:一种在服务器内部的资源的跳转的方式。 访问A,A请求转发了B,…...

java面试题(持续更新)
java面试题(持续更新) java 基础 java面向对象有哪些特征 面向对象的三大特征:封装、继承、多态 封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据,…...

【花雕学AI】09:发挥ChatGPT最大潜力——产生高质量内容的九种方法和建议
人工智能(AI)是当今科技领域最热门和最有前景的话题之一,它已经渗透到了我们生活和工作的方方面面,给我们带来了许多便利和惊喜。而在AI的众多分支中,自然语言处理(NLP)是最贴近人类的一个领域&…...

实战打靶集锦-013-Loly
**写在前面:**记录博主的一次打靶经历 目录1. 主机发现2. 端口扫描3. 服务枚举4. web服务探查4.1 WordPress探测4.2 使用metasploit4.3 使用wpscan4.4 阶段性回顾5. 提权5.1 弱密码提权5.2 操作系统信息枚举5.3 定时任务枚举5.4 passwd信息枚举5.5 可执行文件枚举5.…...

程序员OKR学习法
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl OKR管理法 OKR(Objectives and Key Results)管理法是一种目标管理方法,旨在通过制定明确的目标和可量化的关键结果来帮助组织、团队和个人…...

【从零开始学习 UVM】6.6、UVM 激励产生 —— UVM Virtual Sequence【重要】
文章目录 使用virtual sequencer不使用virtual sequencervirtual sequence是一个容器,用于在环境中的virtual sequencer上启动多个sequence。 这个virtual sequence通常由一个具有对真实sequencers句柄的virtual sequencers执行。 需要virtual sequence的原因是当您需要在不…...
蓝桥杯:阶乘约数
蓝桥杯:阶乘约数https://www.lanqiao.cn/problems/1020/learning/ 目录 题目描述 填空题:答案是 39001250856960000 题目分析 AC代码(Java) 暴力 线性筛 题目描述 填空题 定义阶乘 n!123⋅⋅⋅n。 请问 100! (100 的阶乘)有…...
最大数字
[蓝桥杯 2022 国 B] 最大数字 题目描述 给定一个正整数 NNN。你可以对 NNN 的任意一位数字执行任意次以下 2 种操作: 将该位数字加 111。如果该位数字已经是 999,加 111 之后变成 000。 将该位数字减 111。如果该位数字已经是 000,减 111 之后变成 99…...
【java进阶08:异常】finally关键字、自定义异常类、用户业务作业、军队武器作业
java中的异常处理机制 异常在java中以类和对象的形式存在,那么异常的继承结构是怎样的?我们可以使用UML图来描述以下继承结构 画UML图的工具:Rational Rose、starUML等 Object下有Throwable(可抛出的) Throwable下有两…...

#课程笔记# 电路与电子技术基础 课堂笔记 第6章 半导体器件的基本特性
6.1 半导体基础知识 6.1.1 本征半导体 完全纯净的、结构完整的半导体称为本征半导体。 常用的半导体材料有硅和锗,它们都是四价元素,原子最外层轨道有四个价电子。 若将纯净的半导体制成晶体,则原子形成排列整齐的点阵。 点阵是由共价键提供…...

skimage.filters.apply_hysteresis_threshold详解
本文内容均参考scipy1.9.1scipy1.9.1scipy1.9.1版本的源码,若有任何不当欢迎指出 我们截取官方注释如下: def apply_hysteresis_threshold(image, low, high):"""Apply hysteresis thresholding to image.This algorithm finds regions …...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...