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

【Java基础】HashMap 原理

文章目录

    • 1、HashMap 设置值的原理
    • 2、HashMap 获取值原理
    • 3、HashMap Hash优化
    • 4、HashMap 寻址优化
    • 5、HashMap 是如何解决Hash冲突的?
      • 5.1 get数据的时候,如果定位到指定位置的元素是一个链表,怎么办呢?
      • 5.2 红黑树
    • 6、数组扩容
      • 6.1 数组长度为16,计算index
      • 6.2 数组长度为32, 计算index
      • 6.3 扩容总结:

1、HashMap 设置值的原理

  1. 根据key计算HashCode,
  2. 再使用HashCode对 数组长度取模,结果一定是存放到数组中 的某一个位置。
  3. 得到指定位置索引之后,就往指定位置设置数据即可。

2、HashMap 获取值原理

  1. 根据key计算hashCode,
  2. 再使用hashCode对 数据长度取模,得到一个数组索引,
  3. 然后再根据索引从数组中获取指定数据即可。

3、HashMap Hash优化

      // JDK 1.8以后的HashMap里面的一段源码static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

答案:hash数组一般不会太大,使用 key 的hashCode 和 key的hashCode 右移16位 进行异或运算的目的就是让 高低16位都参与运算,减少hash冲突

4、HashMap 寻址优化

hash & (n - 1)

当n为2的n次方的时候, hash & (n - 1) = hash % n

答案:hash & (n - 1) -> 效果是跟hash对n取模,效果是一样的,但是与运算的性能要比hash对n取模要高很多,数学问题,数组的长度会一直是2的n次方,只要他保持数组长度是2的n次方

5、HashMap 是如何解决Hash冲突的?

使用链表法解决。
在数据的指定位置,挂一个链表,这个链表里放多个元素,让多个 key-value 放在数据的同一个位置

5.1 get数据的时候,如果定位到指定位置的元素是一个链表,怎么办呢?

get 的时候,如果定位到数组发现这个位置挂了一个链表哦,此时就会遍历 链表,从链表里面选择到自己需要的那个 kye-value 就可以了。

5.2 红黑树

为了解决hash冲突的问题,就会在 数据的指定为值挂一个链表,如果链表的长度达到了一定的长度之后,就会将链表转换成红黑树,通过遍历一颗红黑树找到一个元素,此时时间复杂度是 O(logn), 性能比链表要高一些。
如果链表过长,遍历的性能不高,因此当链表长度超过一定限制的时候,就会将链表转换成红黑树,提升搜索性能。

6、数组扩容

6.1 数组长度为16,计算index

n - 1  0000 0000 0000 0000 0000 0000 0000 1111
hash1  1111 1111 1111 1111 0000 1111 0000 0101
&      0000 0000 0000 0000 0000 0000 0000 0101 = 5(index = 5的位置)n - 1  0000 0000 0000 0000 0000 0000 0000 1111
hash2  1111 1111 1111 1111 0000 1111 0001 0101
&      0000 0000 0000 0000 0000 0000 0000 0101 = 5(index = 5的位置)

6.2 数组长度为32, 计算index

n-1    0000 0000 0000 0000 0000 0000 0001 1111
hash1  1111 1111 1111 1111 0000 1111 0000 0101
&结果   0000 0000 0000 0000 0000 0000 0000 0101 = 5(index = 5的位置)n-1    0000 0000 0000 0000 0000 0000 0001 1111
hash2  1111 1111 1111 1111 0000 1111 0001 0101
&结果   0000 0000 0000 0000 0000 0000 0001 0101 = 21(index = 21的位置)

6.3 扩容总结:

数据扩容 -> 2倍扩容 -> 重新对map中的每一个元素进行寻址->通过判断二进制结果是否多出来了一个bit为,判断index的位置是否变化;

如果数组的长度扩容之后 = 32,重新对每个hash值进行寻址,也就是用每个hash值跟新数组的length - 1进行与操作

  • 判断二级制结果是否多出来一个bit的1
  • 如果没有多,那么还是原来的index
  • 如果多了出来,那么新的index = oldIndex + oldCap
  • 通过这个方法避免了rehash的时候,用每个hash对数据的长度进行取模,取模的性能不高,位运算的性能比较高。

相关文章:

【Java基础】HashMap 原理

文章目录 1、HashMap 设置值的原理2、HashMap 获取值原理3、HashMap Hash优化4、HashMap 寻址优化5、HashMap 是如何解决Hash冲突的?5.1 get数据的时候,如果定位到指定位置的元素是一个链表,怎么办呢?5.2 红黑树 6、数组扩容6.1 数…...

vue3的大致使用

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…...

什么是计算机网络?计算机网络基础知识

1.网络的组成部分&#xff1a;由主机&#xff0c;路由器&#xff0c;交换机等组成 2.网络结构&#xff1a;网络的网络 3.信息交换方式&#xff1a;电路交换和分组交换 4.网络分层&#xff1a;分清职责&#xff0c;物理层&#xff0c;链路层&#xff0c;网络层&#xff0c;运…...

【机器学习 | 假设检验系列】假设检验系列—卡方检验(详细案例,数学公式原理推导),最常被忽视得假设检验确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

RealBasicVSR高清处理视频

autodl做了镜像&#xff1a;高清RealBasicVSR 首先在剪映将视频剪好导出&#xff0c;最多是720像素的&#xff0c;不然后面超分的时候会爆显存。剪映视频也最好是双数帧数结尾的&#xff0c;不然超分的时候单数图片会报错->RuntimeError: non-empty 3D or 4D input tensor …...

晚期食管癌肿瘤治疗线程分类

文章目录 1、肿瘤治疗的线数1.1 基础概念1.2 线程定义1.3 如何计算治疗线数 2 食管癌治疗指南2.1 食管癌诊疗指南2.1 CSCO 本文前半部分主要来源于参考文件1&#xff0c;其余部分来源于官方指南。无原创内容&#xff0c;全部为摘要。 1、肿瘤治疗的线数 1.1 基础概念 抗肿瘤药…...

高效营销系统集成:百度营销的API无代码解决方案,提升电商与广告效率

百度营销API连接&#xff1a;构建无代码开发的高效集成体系 在数字营销的高速发展时代&#xff0c;企业追求的是快速响应市场的能力以及提高用户运营的效率。百度营销API连接正是为此而生&#xff0c;它通过无代码开发的方式&#xff0c;实现了电商平台、营销系统和CRM的一站式…...

网络基础(十一):VRRP原理与配置

目录 前言&#xff1a; 1、VRRP的基本概述 2、VRRP的基本原理 2.1VRRP的基本结构 2.2设备类型 2.3状态机 2.4VRRP路由器的抢占功能 2.5VRRP路由器的优先级 2.6VRRP工作原理 2.7主备路由器的工作内容 3、VRRP的基本配置 3.1配置主路由器和备用路由器 3.2配置PC1与P…...

设计模式——状态模式

引言 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 问题 状态模式与有限状态机 的概念紧密相关。 其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中…...

2020-XNUCA babyv8

做的第一道存在指针压缩机制的V8题&#xff0c;通过小越界写修改length构造大越界读写&#xff0c;然后利用arraybuffer的backing store构造任意地址写&#xff0c;利用wasm rwx段地址的特点以及堆空间的分布&#xff0c;搜索到rwx段的具体地址&#xff0c;然后利用任意地址写将…...

货物数据处理pandas版

1求和 from openpyxl import load_workbook import pandas as pddef print_hi(name):# Use a breakpoint in the code line below to debug your script.print(fHi, {name}) # Press CtrlF8 to toggle the breakpoint.# Press the green button in the gutter to run the scr…...

MC-30A (32.768 kHz用于汽车应用的晶体单元)

MC-30A 32.768 kHz用于汽车应用的晶体&#xff0c;车规晶振中的热销型号之一。该款石英晶体谐振器&#xff0c;可以在-40 to 85 C的温度内稳定工作&#xff0c;能满足起动振动的要求。同时满足AEC-Q200无源元件质量标准认证&#xff0c;满足汽车仪表系统的所有要求。 频率范围…...

TrustZone之其他设备及可信基础系统架构

一、其他设备 最后,我们将查看系统中的其他设备,如下图所示: 我们的示例TrustZone启用的系统包括一些尚未涵盖的设备,但我们需要这些设备来构建一个实际的系统。 • 一次性可编程存储器(OTP)或保险丝 这些是一旦写入就无法更改的存储器。与每个芯片上都包含相同…...

自由编程学习资源:free-programming-books

最近&#xff0c;我发现了一个在GitHub上备受欢迎的项目&#xff0c;它为程序员和编程爱好者提供了丰富、免费且高质量的学习资料&#xff0c;这就是"free-programming-books"。目前&#xff0c;这个项目在GitHub上已经有305k的star&#xff0c;显示出它在开发者社区…...

饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二)&#xff1a;一键制作 饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 一键传送源码 饥荒的地图很大&#xff0c;跑地图太耗费时间和饥饿值&#xff0c;如果大部分时间都在跑图真的是很无聊&#xff0c;所以需要有一个能够传送的功能&#xff0c;不仅可以快速…...

Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

一、前言 通过在通道画面上拾取鼠标按下的坐标&#xff0c;然后鼠标移动&#xff0c;直到松开&#xff0c;根据松开的坐标和按下的坐标&#xff0c;绘制一个矩形区域&#xff0c;作为热点或者需要电子放大的区域&#xff0c;拿到这个坐标区域&#xff0c;用途非常多&#xff0…...

Java实现订单超时未支付自动取消的8种方法总结

Java实现订单超时未支付自动取消的8种方法总结 定时轮询 数据库定时轮询方式&#xff0c;实现思路比较简单。启动一个定时任务&#xff0c;每隔一定时间扫描订单表&#xff0c;查询到超时订单就取消。优点&#xff1a;实现简单。缺点&#xff1a;轮询时间间隔不好确定&#x…...

android动态权限申请并展示权限使用说明

# ExplainPermissions 动态权限申请并展示权限使用说明 随着工信部对APP的一系列整治&#xff0c;现在用户对于APP在使用时动态申请的权限是比较敏感的&#xff0c;为了更好的用户体验&#xff0c;我们可以在权限动态申请的时候一并向用户展示所需要申请权限的使用说明。这样用…...

论文阅读《DPS-Net: Deep Polarimetric Stereo Depth Estimation》

论文地址&#xff1a;https://openaccess.thecvf.com/content/ICCV2023/html/Tian_DPS-Net_Deep_Polarimetric_Stereo_Depth_Estimation_ICCV_2023_paper.html 概述 立体匹配模型难以处理无纹理场景的匹配&#xff0c;现有的方法通常假设物体表面是光滑的&#xff0c;或者光照是…...

docker文档转译1

写在最前面 本文主要是转译docker官方文档。主题是Docker overview&#xff0c;这里是链接 Docker概述 Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使你能够将应用程序与基础设施分离&#xff0c;从而可以快速交付软件。你可以使用相同的方法像管理应用程序…...

别再滥用Tick了!UE5里Cast To的正确打开方式与性能实测

UE5性能优化实战&#xff1a;Tick事件中Cast To的高效替代方案 在虚幻引擎5的项目开发中&#xff0c;性能优化往往隐藏在那些看似无害的日常操作里。Tick事件中的Cast To操作就像房间里的大象——人人都知道它存在&#xff0c;却常常低估它的影响。当项目规模扩大、逻辑复杂度提…...

MAX30102血氧传感器避坑指南:如何解决I2C信号干扰问题(附Arduino代码)

MAX30102血氧传感器实战&#xff1a;I2C信号干扰的深度解析与解决方案 当你在深夜调试MAX30102传感器时&#xff0c;突然发现心率数据频繁跳变——这可能是I2C信号干扰在作祟。作为一款高精度光学传感器&#xff0c;MAX30102在医疗级血氧监测和心率检测中表现出色&#xff0c;但…...

面向对象编程入门(下篇):继承、封装与多态

在上篇中&#xff0c;我们学会了如何定义类和创建对象&#xff0c;将现实世界的事物用代码表示。今天&#xff0c;我们将深入面向对象编程的三大核心特性&#xff1a;继承、封装和多态。这些特性将让你的代码更加灵活、可扩展和易维护。一、继承&#xff1a;代码复用的“家族传…...

Windows下OpenClaw安装指南:对接ollama GLM-4.7-Flash模型

Windows下OpenClaw安装指南&#xff1a;对接ollama GLM-4.7-Flash模型 1. 为什么选择OpenClaw GLM-4.7-Flash组合 作为一个长期在Windows环境下折腾AI工具的开发者&#xff0c;我一直在寻找一个既能保持本地数据隐私&#xff0c;又能灵活对接各类开源模型的自动化框架。Open…...

深入浅出:图解程序控制、中断和DMA的工作原理与性能差异

深入浅出&#xff1a;图解程序控制、中断和DMA的工作原理与性能差异 想象你在一家餐厅点餐&#xff1a;第一种方式是服务员每隔30秒就来问你"好了吗"&#xff1b;第二种是你按服务铃&#xff0c;服务员立刻过来&#xff1b;第三种是厨房直接把菜送到你桌上——这正是…...

OpenClaw性能优化:降低GLM-4.7-Flash任务Token消耗的5个技巧

OpenClaw性能优化&#xff1a;降低GLM-4.7-Flash任务Token消耗的5个技巧 1. 为什么需要关注Token消耗 当我第一次在本地部署OpenClaw并接入GLM-4.7-Flash模型时&#xff0c;最让我震惊的不是它的自动化能力&#xff0c;而是执行简单任务后查看账单时的Token消耗数字。一个看似…...

开局掌控者:EdB Prepare Carefully - RimWorld自定义体验革命

开局掌控者&#xff1a;EdB Prepare Carefully - RimWorld自定义体验革命 【免费下载链接】EdBPrepareCarefully EdB Prepare Carefully, a RimWorld mod 项目地址: https://gitcode.com/gh_mirrors/ed/EdBPrepareCarefully 副标题&#xff1a;如何告别随机开局&#xf…...

MaterialSkin 2:WinForms应用的Material Design现代化解决方案

MaterialSkin 2&#xff1a;WinForms应用的Material Design现代化解决方案 【免费下载链接】MaterialSkin 项目地址: https://gitcode.com/gh_mirrors/mat/MaterialSkin 在传统Windows Forms应用程序面临界面陈旧、用户体验落后的挑战下&#xff0c;WinForms现代化改造…...

PTA L1-064 AI核心代码:从‘估值一亿’到‘精准实现’的避坑指南

1. 这道题为什么值"一亿"&#xff1f; PTA L1-064被戏称为"估值一亿"的题目&#xff0c;主要因为它在字符串处理中埋了多个隐蔽的坑点。我第一次做这道题时&#xff0c;看着题目要求觉得规则很明确&#xff0c;不就是几个字符串替换吗&#xff1f;结果提交…...

OpenClaw备份方案:GLM-4-7-Flash自动加密重要文件并上传网盘

OpenClaw备份方案&#xff1a;GLM-4-7-Flash自动加密重要文件并上传网盘 1. 为什么需要自动化加密备份 去年的一次硬盘故障让我损失了三个月的项目资料&#xff0c;这件事彻底改变了我对数据安全的认知。传统备份方案要么需要手动操作&#xff08;容易遗忘&#xff09;&#…...