Java基础知识-Map

2023-10-26



   1、Map体系

    


  2.各实现类说明及区别


 3、哈希映射技术

     哈希映射技术是一种就元素映射到数组的非常简单的技术。由于哈希映射采用的是数组结果,那么必然存在一中用于确定任意键访问数组的索引机制,该机制能够提供一个小于数组大小的整数,我们将该机制称之为哈希函数。在Java中我们不必为寻找这样的整数而大伤脑筋,因为每个对象都必定存在一个返回整数值的hashCode方法,而我们需要做的就是将其转换为整数,然后再将该值除以数组大小取余即可。如下

    

int hashValue = Maths.abs(obj.hashCode()) % size;


----------HashMap------------//计算hash值static int hash(int h) {    h ^= (h >>> 20) ^ (h >>> 12);    return h ^ (h >>> 7) ^ (h >>> 4);}//计算key的索引位置static int indexFor(int h, int length) {        return h & (length-1);}-----HashTable--------------int index = (hash & 0x7FFFFFFF) % tab.length;     //确认该key的索引位置

位置的索引就代表了该节点在数组中的位置,基本原理图:




在该图中1-4步骤是找到该元素在数组中位置,5-8步骤是将该元素插入数组中。在插入的过程中会遇到一点点小挫折。在众多肯能存在多个元素他们的hash值是一样的,这样就会得到相同的索引位置,也就说多个元素会映射到相同的位置,这个过程我们称之为“冲突”。解决冲突的办法就是在索引位置处插入一个链接列表,并简单地将元素添加到此链接列表。当然也不是简单的插入,在HashMap中的处理过程如下:获取索引位置的链表,如果该链表为null,则将该元素直接插入,否则通过比较是否存在与该key相同的key,若存在则覆盖原来key的value并返回旧值,否则将该元素保存在链头(最先保存的元素放在链尾)。



4、优化-调整实现大小
在哈希映射表中,内部数组中的每个位置称作“存储桶”(bucket),而可用的存储桶数(即内部数组的大小)称作容量 (capacity),我们为了使Map对象能够有效地处理任意数的元素,将Map设计成可以调整自身的大小。我们知道当Map中的元素达到一定量的时候就会调整容器自身的大小,但是这个调整大小的过程其开销是非常大的。调整大小需要将原来所有的元素插入到新数组中。我们知道index = hash(key) % length。这样可能会导致原先冲突的键不在冲突,不冲突的键现在冲突的,重新计算、调整、插入的过程开销是非常大的,效率也比较低下。所以,如果我们开始知道Map的预期大小值,将Map调整的足够大,则可以大大减少甚至不需要重新调整大小,这很有可能会提高速度。

5、优化-负载因子

为了确认何时需要调整Map容器,Map使用了一个额外的参数并且粗略计算存储容器的密度。在Map调整大小之前,使用”负载因子”来指示Map将会承担的“负载量”,也就是它的负载程度,当容器中元素的数量达到了这个“负载量”,则Map将会进行扩容操作。负载因子、容量、Map大小之间的关系如下:负载因子 * 容量 > map大小  ----->调整Map大小。

例如:如果负载因子大小为0.75(HashMap的默认值),默认容量为11,则 11 * 0.75 = 8.25 = 8,所以当我们容器中插入第八个元素的时候,Map就会调整大小。

负载因子本身就是在控件和时间之间的折衷。当我使用较小的负载因子时,虽然降低了冲突的可能性,使得单个链表的长度减小了,加快了访问和更新的速度,但是它占用了更多的控件,使得数组中的大部分控件没有得到利用,元素分布比较稀疏,同时由于Map频繁的调整大小,可能会降低性能。但是如果负载因子过大,会使得元素分布比较紧凑,导致产生冲突的可能性加大,从而访问、更新速度较慢。所以我们一般推荐不更改负载因子的值,采用默认值0.75.



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

Java基础知识-Map 的相关文章

随机推荐

  • python中对配置环境的理解

    在咱们学习python前 老师和书本就已经教我们应该如何配置python环境 1 安装python 安装好后 找到python exe 打开其属性 复制他的路径 2 打开控制面板中的所有控制面板项后 选择系统 点击左边的高级系统设置 在高级
  • 进程管理&&内存管理

    操作系统详述 目录 操作系统详述 一 进程管理 这是重点 1 什么是进程管理 2 如何做好进程调度 1 需要把进程这个抽象的概念用数据表示处理 抽象成一个对象 这就是面向对象思想 2 需要对进程做分区 3 现在手上有等待分配CPU的所有进程
  • Linux下使用OpenCv驱动RGB多款彩色摄像头

    最简单的驱动 cout lt lt Built with OpenCV lt lt CV VERSION lt lt endl VideoCapture capture 0 打开摄像头 if capture isOpened 判断是否打开成
  • 多模态大模型系列论文(ALBEF、BLIP、BLIP-2)

    1 ALBEF ALign the image and text BEfore Fusing 1 1 论文与代码链接 https arxiv org abs 2107 07651 GitHub salesforce ALBEF Code f
  • Linux系统项目测试环境部署步骤及操作流程

    jdk安装 在linux上安装JDK 版本位要与linux版本一致 可以通过winscp工具进行安装 把jdk包下载到windows系统上 通过winscp把jdk包直接拖到linux系统的目录中去 具体linux命令步骤 1 tar zx
  • replaceAll遇到特殊字符无法替换问题的坑

    问题 当出现 或者 或者 符等 会导致 无法替换 在一定程度上 这个也算是 一个坑吧 问题原因 replaceAll支持正则 出现正则的符号 就会被当作是正则 从而无法正常替换 解决办法 网上有一个解决方案 是采用 Matcher quot
  • JetBrains IDEA 的安装与设置

    为什么80 的码农都做不了架构师 gt gt gt JetBrains Toolbox 下载 安装 配置 JetBrains IDEA 下载 安装 配置 JetBrains Toolbox 下载 安装 官方下载地址 https downlo
  • MyBatisPlus条件查询的三种格式于null判定

    DQL编程控制 条件查询 MyBatisPlus将书写复杂的SQL查询条件进行了封装 使用编程的形式完成查询条件的组合 方式一 使用QueryWrapper查询数据 lt是小于的意思 price是数据表的字段名称 price容易写错 不推荐
  • VQGAN2_latent diffusion model

    task1 txt2image 先根据config一层层调用 先是ldm models diffusion ddpm LatentDiffusion 里面super init conditioning key conditioning ke
  • SPI协议详解(Standard SPI、Dual SPI和Queued SPI)

    1 标准SPI 1 1 SPI接口的引脚 1 SCLK 时钟线 2 MOSI master output slave input 主设备输出 从设备输入 单向传输 3 MISO master input slave output 主设备输入
  • 查找算法--二分查找 c++实现

    二分查找也称折半查找 Binary Search 它是一种效率较高的查找方法 但是 折半查找要求线性表必须采用顺序存储结构 而且表中元素按关键字有序排列 vs2017 include
  • Docker学习--Docker仓库之Docker Hub的简单了解

    Docker之所以能这么快的火起来 和Docker Hub的作用是分不开的 Docker构建了像GitHub一样的仓库 用来存放大家构建好的Docker镜像 其中已经包括了15000的镜像 大部分需求 都可以通过在Docker Hub中直接
  • npm不是以管理身份运行遇到的问题

    环境 win10 npm3 10 5 问题 在npm install lodash时 出现下列错误 npm debug log 文件内容 0 info it worked if it ends with ok1 verbose cli C
  • 性能测试相关术语

    性能测试相关术语 一 负载 模拟业务操作对服务器造成压力的过程 比如模拟100个用户发帖 二 性能测试 Performance Testing 模拟用户负载来测试系统在负载情况下 系统的响应时间 吞吐量等指标是否满足性能要求 三 负载测试
  • Makefile = 、:=、?=的区别

    相当于 c 语言中的 预编译的过程 在真正解释Makefile前会先将对应的 号左边的量替换成右边的量 而 则是跟 宏观的 号相似 是简单赋值的运算符号 下面举个例子就可以清楚的知道它们之间有何不同 cross arm linux cc c
  • 开关电源怎么测试文波_为什么开关电源需要测试动态响应

    1 导读概念动态响应一般是指控制系统在典型输入信号的作用下 其输出量从初始状态到最终状态的响应 对某一环节 系统 加入单位阶跃输入x t 时 其响应y t 开始逐渐上升 直到稳定在某一定值上为止 响应y t 在达到一定值之前的变化状态称为过
  • 直播分发选低延迟 RTC 还是 CDN?

    简单来看 一个完整的直播应用实现原理是 主播端采集音视频 推到服务器 再由服务器分发给观众观看 主播端负责推流 需要配置选用 RTC 链路分发直播画面或者用 CDN 链路分发 如果涉及连麦还需要考虑如何做 MCU 合流 观众订阅合流的好处是
  • python 读取配置文件config_python学习-读写配置文件-ConfigParse用法

    一 读取配置文件 config ini read filname 读取文件内容 section 获取所有section 返回list options section 获取该section所有options 返回list items sect
  • IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)

    切入主题 看看今天的错误是如何发生的 首先这是我的项目路径 java 是 Sources Root resources 是 Resources Root 放了所需要的配置文件 其中 Hibernate 的配置 显示的是绿色 说明没有问题 在
  • Java基础知识-Map

    1 Map体系 2 各实现类说明及区别 3 哈希映射技术 哈希映射技术是一种就元素映射到数组的非常简单的技术 由于哈希映射采用的是数组结果 那么必然存在一中用于确定任意键访问数组的索引机制 该机制能够提供一个小于数组大小的整数 我们将该机制