hasMap底层实现原理

【Java中HashMap底层实现原理】 本文简单介绍了hashmap的扩容机制,此处是学习java基础部分的重难点之一,学完之后要记得及时巩固,以免遗忘,在今后的面试和工作中这里也是经常要用到的地方。 阅读详情

新手都能明白的hasMap底层实现原理

说到hasmap 先说说HasMap 和HasTable 的区别

相同点:都是用来存储键值对(key value),都实现了map接口的实现类

不同点:1, HasMap 的key,value,可以是null ,但是HasTable不可以

2:HasMap 是线程不安全的,效率高

HasTable是线程安全的。,效率低

存储方式 :用来存储键值

在jdk1.7之前,HasMap 是通过数组加上链表的结构方式来储存,在jdk1.8以后,HasMap 以数组 + 链表的+ 红黑树的方式存储。

数组:是一段连续固定的内存空间
链表:不要求内存是连续的 ;

当我查询的时候,需要遍历一次才能那到想要的值,查询效率低,数组只需要给定需要查询的数的索引就可以查询,效率高;

做添加或者删除的时候,数组需要移动内存。所以效率比较低,但是对于链表来说,直接将引用改变就可以.(也就是将他的指针指向前(后)一个,不会移动内存)

我们对HasMap的操作,无非是put()和get();
当我做的是put(key,value)操作的时候:
1,将k,v放到我的Node节点,
2,通过hascode(算法)得出具体的has值
3,将计算出来的has值做has运算后作为数组的下标,  
---:通过下标存储,如果在当前的下标没有值的话,就直接把该node放在该位置,如果该下标是链表的方式,那么就将该node的key和该链表上node的key进行equals比较,如果结果所有返回的是flase,那么就将key放在该链表的末尾。如果其中有一个是true,那么传来的key对应的value将被覆盖。
当我需要get的时候:
同样的我需要get值的时候,我也会把key的值进行hascode()的方法拿到has值
,再将has值进行has算法,最终将返回的int做为下标,同过下标去获取到他的值,
如若在数组的该下标位置没有值的话,返回一个nulll,
如果将下标是一个单向链式结够,那么将传入的key值作和该链表的所有key进行equals,
返回的是false、那么就返回null,如果是true,那么就返回该位置的value。

loadFactor:负载因子: threshold
 扩容原理
 需要注意的是:HashMap使用的是懒加载        
 在我创建的时候,并不会主动去扩容,当首次调用put方法时,HashMap会发现table为空然后调用resize方法进行初始化,当添加完元素后,如果HashMap发现size(元素总数)大于threshold(阈值),则会调用resize方法进行扩容
大于threshold,if(threshold)不为空的话,就是table的初始化为阈值,否则默认为16;

负载因子默认为0.75  当我put value后,table的阈值增加到最大的时候。也就是等于负载因子最大负载的时候,就开始
进行扩容,扩容的长度为他的2倍。
HashMap底层原理 阅读详情

相关推荐

车载导航GPS欺骗

因此,如果我们能够模拟卫星信号,将模拟的信号通过信号发射装置发送给GPS传感器,那么就有可能实现欺骗GPS传感器获取虚假的位置信息,这种技术即SDR(软件无线电,Software Defined Radio)[2]。究其原因,在不使用时钟模块的条件下,HackRF发送信号的频率可能不十分精准,因此GPS传感器接收到信号之后可能无法正常解析GPS信号,因此时钟信号可能是HackRF进行GPS欺骗的关键。2)HackRF是否使用了时钟模块,时钟模块决定了信号发送频率的精准程度,对实验的成败也是至关重要的。

2503_90751789的博客 1324

HashMap详解

一、HashMap集合简介 HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。 jdk1.8 之前 HashMap 由 数组 + 链表 组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存

java123456111的博客 5万+

catia之车灯设计——灯玻加厚之后(单层灯玻、多层灯玻的设计)

加厚完A面后如果主机厂没有给其他的面我们该怎么做?

qq_19829077的博客 1304

(新手必看)HashMap是什么?

那么HashMap什么时候进行扩容呢?当hashmap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过16*0.75=12的时候,就把数组的大小扩展为2*16=32

xyk:的博客 1万+

Codesys电子凸轮从入门到应用:手把手教你用MC_CamIn/MC_CamOut实现主从轴同步

本文详细介绍了如何在Codesys平台上使用MC_CamIn和MC_CamOut功能块实现电子凸轮的主从轴同步控制。从环境配置、轴使能到凸轮表创建与动态切换,提供了完整的程序编写指南和调试技巧,帮助工程师快速掌握工业自动化中的高精度运动控制技术。

weixin_26878995的博客 276

保姆级教程:用MATLAB复现格拉斯哥大学FMCW雷达数据集多普勒谱(附完整代码与避坑指南)

本文提供了一份详细的MATLAB教程,指导如何复现格拉斯哥大学FMCW雷达数据集的多普勒谱分析。从环境准备、数据获取到距离压缩、MTI滤波、时频分析(STFT)以及结果后处理,涵盖了完整流程,并附有优化代码和避坑指南,特别适合雷达信号处理研究者和工程师。

weixin_28720767的博客 114

HashMap在jdk1.7和jdk1.8中的区别

一、初窥HashMap HashMap是应用更广泛的哈希表实现,而且大部分情况下,都能在常数时间性能的情况下进行put和get操作。 jdk1.7中底层是由数组(也有叫做“位桶”的)+链表实现;jdk1.8中底层是由数组+链表/红黑树实现 可以存储null键和null值,线程不安全。在HashMap中,null可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该key,也可以表示该key所对应的value为null。因

qq_34325438的博客 2600

madgwick算法基于MPU9250姿态融合漂移问题的原因

基于MPU9250的madgwick算法姿态漂移问题原因 0、声明 因为这个是现象是不是共性目前本人还没研究过,只是在个体问题研究的基础上得出的结论,或许我买到的MPU9250是一个盗版:),所以只具备参考性。 1、现象 使用MPU9250的加速度计、角速度计、磁力计(AK8963)原始数据输入到madgwick算法中,得到的姿态最终会在停止姿态变化后仍然漂移一小段时间。其中加速度计和角速度计读取速率为400hz,磁力计为100hz,加速度计采样范围±2g,角速度计采样范...

GreedyZombie的博客 3872

【Java】HashMap实现原理分析(源码分析,ReHash,扩容机制)

目录 一、HashMap的数据结构 解决hash冲突的办法 二、源码分析 1.位桶数组 2.数组元素Node实现了Entry接口,v> 3.HashMap如何put(key,value) 4.HashMap如何getValue值 5.HasMap的扩容机制resize(); 6. JDK1.8使用红黑树的改进 三、再谈ReHash 单线程下的ReHash ...

康师傅没有眼泪 4582

「深度学习之优化算法」(五)差分进化算法

每次迭代将先进行变异操作,选择一个或多个个体的基因作为基,然后选择不同的个体的差分来构成差分基因,最后将作为基的基因与差分基因相加来得出新的个体。,大喊一声,进化吧,魔王兵i的基因改变了。交叉率CR,影响基因取自变异基因的比例,由于至少要保留一位自己的基因和变异的基因导致CR在该问题上对算法性能的影响不大(这个问题比较简单,维度较低,影响不大)。与遗传算法同为进化算法的差分进化算法,它们的操作(算子)也都非常相似的,都是交叉,变异和选择,流程也几乎一样(遗传算法先交叉后变异,差分进化算法先变异后交叉)。

quanzhan_King的博客 1505

安装Office程序时无法安装的解决方案

本文主要介绍了安装Office程序时无法安装的解决方案,希望能对安装Office的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 前置步骤 2.2 方法一 2.3 方法二

weixin_43178406的博客 15万+

Java面试之Hasmap 底层实现原理

Evernote Export 第三章 5.集合-HashMap原理解析 1.问题引入 我们都接触过这道题,有如下字符串aabcccdd由任意英文字母组成,试统计每个字母的出现次数? 一种笨办法是: public static void main(String[] args) { String str = "aabcccdd"; for(...

We_chuan的博客 889

手把手教你学PCIE(5.1)--pcie固件初始化的硬件初始化

PCIe 固件初始化的硬件初始化是一个复杂但至关重要的过程。通过正确配置 PCIe 控制器和相关硬件,可以确保系统的稳定性和性能。以上步骤和示例代码提供了一个基本的框架,实际开发中可能需要根据具体的硬件和需求进行调整和优化。

MHD0815的博客 1688

HashMap底层实现和原理分析(资料源自于源码学院)

一、Map的快速开始 Map map=new HashMap(); //map的添加数据 map.put("name","小明") map.put("age","28") //从map中获取数据 map.get("name") 二、Map的技术实现 HashMap的底层实现是:数组+链表+红黑树(jdk8以后加入红黑树) 数组的概念:采用一段连续的存储单元来存储数据 数组的特点是:查询快,插入慢 链表的概念:链表是一种物理存储单元上非连续、非顺序的数据结构 链表的特点:插...

qq_35642047的博客 397

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HashMap的实现原理+阿里HasMap面试题

HashMap可以说是面试必问的,是因为我们平时是经常使用的,而掌握他的底层原理,对于我们的工作也会有很大帮助.在学习HashMap之前我们需要明白两个问题,这两个问题如果搞明白,对于我们下面的学习将会容易很多.一.hashcode和equals,==equals:是否同一个对象实例。注意,是“实例”。比如String s = new String("test");  s.equals(s), 这...

lizhen1114的博客 7385

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

为什么要学习HashMap的底层原理?

本文转载自公众号  码农翻身 上周发了一篇文章《漫画:什么是HashMap?》,引起了不少人的讨论,有一个人的留言引发了我的思考:“作为一个程序员, 真的有必要学习这些底层原理吗? 我会用了不就行了吗? 为什么面试者喜欢问这么细节的东西呢?” 是啊,在日常的工作中,如果只是做应用层面的业务开发,大多数都是直接把

程序员小灰的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

hasmap和treemap的实现与区别

2.两种常规Map实现   HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。   (1)HashMap(): 构建一个空的哈希映像   (2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映

程序员孙大喵丶的博客 1961

关于Map的内部及底层原理的详细概述详解

Map(深层理解详述) 目录: ​ 一、Map的实现类的结构: ​ Map集合概述和特点 ​ 二、Map结构的理解 ​ 三、HashMap的底层实现原型?以jdk7为例说明: ​ HashMap map= new HashMap() ​ jdk8 相较于dk7在底层实现方面的不同 ​ HashMap源码中的重要常量 ​ 四、LinkedHashMap的底层实现原理(了解) ​ 五、Map 排序: ​

小心猿new小不点的博客 4942

hasMap底层原理

hashMap底层原理

rwh19951022的博客 180

HasMap 原理

hasmap

yanchao315的博客 318

复习一波,hashMap的底层实现原理

前言 HashMa是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构; java中集合的分类: java中的集合可以分为:单列集合(collection)与双列集合(Map) 单列集合(collection) collection 有两个重要的子接口,也就是List和Set List的特点是: (存取有序,有索引,元素可以重复); Set的特点是: (存取无序,没有索引,元素不可以重复); List 重要的实现类有:ArrayList,LinkedList

qq_44322555的博客 6742

java中hashmap的实现原理与底层数据结构

Hashmap是java面试中经常遇到的面试题,大部分都会问其底层原理与实现,本人也是被这道题问惨了,为了能够温故而知新,特地写了这个博客,以便时时学习。 Hash结构 HashMap根据名称可知,其实现方法与Hash表有密切关系。在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能。 数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给...

技术小白的博客 8万+

16.HashMap底层实现原理解析

文章目录一. HashMap的使用方法二. 底层实现原理1. 结构分析2. HashMap中的put()和get()的实现原理:3. HashMap红黑树原理分析 一. HashMap的使用方法 详细使用方法 方法 描述 clear() 删除 hashMap 中的所有键/值对 clone() 复制一份 hashMap isEmpty() 判断 hashMap 是否为空 size() 计算 hashMap 中键/值对的数量 put() 将键/值对添加到 hashMap 中 putAll() 将所有键/值对添加

weixin_45809838的博客 312

HasMap底层源码

这里以put方法为例hash(key)用来获取key的哈希值h = key.hashCode()) ^ (h >>> 16)是为了获取更为准确的哈希值,将高位也参与进运算,减少产生哈希冲突的概率。

2403_82461011的博客 288

HashMap实现原理分析

之前转载过一篇HashMap相关分析文章,快速链接:HashMap实现原理分析 既然有前辈已经将源码分析总结了出来,我们在继续学习研究源码实现的时候不妨借鉴借鉴前人的总结与经验~ 本文转自:https://blog.youkuaiyun.com/hefenglian/article/details/79763634 深度好文,先转载过来,慢慢研究。 目录 一、底层数据结构 二、HashMap...

冷血之心的博客 7004
上一篇: sql 关键字的用法
下一篇: java正则表达式
gudfdd
博客等级 码龄8年 1粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值