Hashmap详细解析,原理及使用方法分析

hashmap基本原理

  • 根据的hashCode值存储数据。由数组+链表组成的,Entnr数组是HashMap的主体,数组中每个元素是一个单向链表。链表则是1/1解哈希冲突而存在的。在lava8中,使用红黑树优化。当链表长度大于8并且元素个数大于64,转为红黑树。 找长度是logn, log8=3,8/2=4.
  • 链表转红黑树阈值是8—hash碰撞8次的概率很低,8够用了。
  • 红黑树转链表是6–如果在8附近,会发生链表和红黑树相互转化。

构造函数

  • 默认;指定初始容量;指初始容量和负载因子;包含子map的构造函数。

hashmap数据插入原理

  1. 首先判断数组是否为空,为空进行初始化;
  2. 计算k的hashcode值进而得到hash值,计算应该存储的下标index;
  3. 如果tablelindex为空,直接插入:否则判断k是否相等,相等就罗盖value值:(hashCode,eauals)
  4. 否则判断是树形节点,是的话就插入;否则就插入链表中,判断长度是否大于8,大于转化为红黑树。
  5. 插入后,判断节点数是否大于阈值,大于就扩容。

HashMap使用第0个桶存放键为null的键值对。

hashmap初始容量的设置

  • 默认容量16,负载因子0.75.如果自己传入c,容量大小是大于c的2的次方,例如,传入12,容量为16.
  • 具体:把高位为1的后面全变为1,最后再进行+1操作。(让初始二进制右移1,2,4,8,16位,位或,要先减去1,如果cap已经是2的次幂,不减1最后得到的cap是cap的两倍)

在这里插入图片描述

为什么hashmap容量是2的整数次?

  • 这样length-1相当于低位掩码,高位全部为0,只保留低位值(相当于对容量取模操作,位运算更快)

hashmap的hash函数

在这里插入图片描述

  • 先得到K的hashcode0值,32位的int;右移16位,与自己异或。也就是高16和低16位异或。增大低位的随机性,降低hash碰撞(扰动函数)

为什么hashcode之后还要hash?

  • 因为int型散列范围很大,40亿长度数组太大了.

怎么得到下标index?

  • 把散列值h和数组长度length-1做”与“操作。位运算&比%要快。

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

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

相关文章

官宣!招商工作全面启动“2024南京智博会”众多企业踊跃报名

2024南京智博会,作为一场盛大的科技盛宴,经过多年的发展与沉淀,已经成功跻身国内顶尖的高新技术产品及解决方案的展示平台之列,成为了引领行业趋势的风向标。本届智博会不仅汇聚了众多知名科技企业,更展现了国内外最前…

Java扫盲

1.常见的代码结构: 转自知乎天马行空的程序猿

##19 序列与时间序列预测:运用RNN和LSTM在PyTorch中的实践

文章目录 前言时间序列预测的基本概念关键概念 RNN及其局限性LSTM网络的崛起用PyTorch进行时间序列预测准备数据集数据预处理创建数据加载器构建LSTM模型训练模型测试和评估模型结语 前言 随着数据的爆炸式增长,时间序列预测在多个领域内变得越来越重要。它能帮助我…

jenkins+docker实现前后端项目的自动化构建和容器部署

1、安装环境 centos 2、docker安装 yum install docker# 启动docker systemctl start docker 3、docker 安装jenkins 3.1 拉取jenkins镜像 docker pull jenkins/jenkins:latest-jdk8 3.2 启动jenkins容器 docker run -d --name jenkins -u root --privilegedtrue --res…

界面组件DevExpress Reporting v24.1预览版 - 拥有原生Angular报表查看器

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 下一个主要更新(v24.1)将于6月初发布&#xff…

JWT -- 复盘

1、前言 1.1、Token流程 先来回顾一下利用 token 进行用户身份验证的流程: 客户端使用用户名和密码请求登录服务端收到请求,验证用户名和密码验证成功后,服务端会签发一个 token,再把这个 token 返回给客户端客户端收到 token 后…

Linux进程(一) -- 介绍进程

计算机的系统架构 用户部分 这是用户直接与计算机交互的部分,包括以下三种操作: 指令操作:用户通过命令行界面(CLI)输入指令来操作计算机。开发操作:开发人员编写和调试程序代码,与计算机系统…

[AWS] stepfunctions-local

本质是本地docker,只支持异步调用 run aws-stepfunctions-localdocker run -p 8083:8083 \ --mount type=bind,readonly,source=/path/MockConfigFile.json,destination=/home/StepFunctionsLocal/MockConfigFile.json \ -e SFN_MOCK_CONFIG="/home/StepFunctionsLocal/…

照明灯具十大排名都有哪些?市面上比较流行的十大护眼台灯品牌推荐

照明灯具十大排名都有哪些?护眼台灯排名当中靠前的主要有书客、飞利浦、松下等品牌。照明灯具作为家居与办公环境中不可或缺的元素,其品质与选择直接关系到人们的视觉健康与舒适度。本文将为大家揭示照明灯具的十大排名,让大家了解市场上最受…

【科学研究】 女性主义:网络中的性别歧视现象

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

识别AI论文生成内容,降低论文高AI率

AI写作工具能帮我们在短时间内高效生成一篇毕业论文、开通报告、文献综述、任务书、调研报告、期刊论文、课程论文等等,导致许多人开始使用AI写作工具作为撰写学术论文的辅助手段。而学术界为了杜绝此行为,开始使用AIGC检测系统来判断文章是由AI生成还是…

TL(TypeLetters)功能扩展#002:解放CPU。带打字练习软件原理分析

TL(TypeLetters)功能扩展#002: 解放CPU,带打字练习软件原理分析。 今天Type Letters时发现一个问题,TL的CPU占用达到了14%,按说一个小小的打字练习软件,不会有这么高的CPU占用率,是什…

「Qt Widget中文示例指南」如何实现一个快捷编辑器(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 快捷编辑器示例展示…

1U机架式多卡聚合设备在视频指挥车上的应用解决方案

随着信息技术的飞速发展,视频指挥车作为现代化指挥系统的重要组成部分,在各类应急指挥调度中发挥着越来越重要的作用。而1U机架式多卡聚合设备,以其高带宽、高可用性和高稳定性的特点,成为视频指挥车中不可或缺的关键设备。本文将…

Softing工业新版dataFEED OPC Suite支持访问SINUMERIK 840D数控机床

2024年4月17日(哈尔),Softing工业自动化宣布发布dataFEED OPC Suite V5.35新版。该版本支持访问SINUMERIK 840D数控机床数据,并集成了Web服务功能。 (dataFEED OPC Suite V5.35支持访问SINUMERIK 840D数控机床&#xf…

腾讯云服务器部署前后端服务

服务器:OpenCloudOS (兼容centos8) 后端:javaSpringboot 前端:Vue 下载jdk 1)下载jdk11 wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz 2)解压jdk …

基于微信小程序+JAVA Springboot 实现的【停车场小程序】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 停车场微信小程序的设计与实现 在当前信息技术飞速发展的背景下,停车场微信小程序的开发成为了一个创新的解决方案,旨在提高停车场管理的效率和用户的停车体验。本项目通过深入分析现有停车场管理系统的不足&#xff0c…

硬件FMEA与软件FMEA的区别——FMEA软件

​免费试用FMEA软件-免费版-SunFMEA 在产品开发和制造过程中,失效模式与影响分析(FMEA)作为一种预防性的质量工具,对于确保产品性能和质量至关重要。然而,硬件FMEA和软件FMEA在应用和实践方面存在显著的区别。本文旨在…

第51期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

双星号(**)和单星号(*)在Python参数传递中的妙用

在Python中,参数传递是一个非常重要的概念,它允许函数接收任意数量的参数。而双星号(**)和单星号(*)在参数传递中扮演着关键角色。本文将详细讲解这两个符号的用法,并通过示例代码帮助初学者理解它们的工作原理。 单星号(*) 单星号(*)用于函…