Java HashMap底层原理解析
Java的HashMap底层原理解析
java集合中有比较重要的两个概念
一个是Collection(存放单个数据)实现了list和set两个接口
一个是Map(存放键值对)
今天就主要来讨论一下Map中的HashMap的底层原理
1.HashMap存储结构
HashMap的存储结构为数据结构中散列表(哈希表)中的链式存储结构,其构成为数组+连表的存储结构 如下图
即存储的数据先经过hash算法计算存储位置,相同位置的数据存储在对应数组后,并依次形成链表形式。
2.HashMap存储的数据类型(比较复杂)
(1)HashMap底层维护了Node类(可以存储键值对的数据类型,并且是实现了Map.Entry<K,V>接口)形成的数组table,默认为null。
(2)为了方便遍历,还会创建EntrySet集合,集合内放入的元素类型为Entry 该类型就有K,V 即EntrySet<Entry<key,value>>
例如下图,每一个横行是一个Entry ,4个Entry 组成一个EntrySet
Entry 中的每一个 key 值存储在Set中,而KeySet中的每个值都指向Node类中的Key值
Entry 中的每一个 value 值存储在Collection中,而Collection中的每个值都指向Node类中的Value值
(这里使用了向上造型的思想,EntrySet<>中其实放入的是实现Map.Entry<K,V>的Node类)重点
这些事情只是为了。Entry 中的**getKey()和getValue()**方法,可以直接获取键与值。。。
3.HashMap的动态生成
因为HashMap是动态生成的集合,下面是它的扩容原理
(1)首次添加,则需要扩容table容量为16,K-V的个数临界值(threshold)为12(16*0.75)
(2)以后再扩容,则需要扩容table容量为原来的2倍(32),临界值为原来的2倍,即24,依次类推
(3)在Java8中,如果一条链表的元素个数超过8个,如果table的大小 < 64,进行扩容
table的大小 >= 64,就会进行树化,变为红黑树(方便进行查询操作)
下图为总体结构图
4.HashMap的添加机制
添加key-val时,通过计算key的哈希值得到在table的索引。然后判断该索引处是否有元素,
如果没有元素直接添加。
如果该索引处有元素,继续判断该元素的key和准备加入的key相是否等,
如果相等,则直接替换val;
如果不相等需要判断是树结构还是链表结构,做出相应添加处理。
如果添加时发现容量不够,则需要扩容。
以上就是HashMap基本的设计理念分析,参考源码进行书写总结,放心查阅.
Java HashMap底层原理解析相关推荐
- HashMap底层原理(当你put,get时内部会发生什么呢?)
HashMap底层原理解析(一) 接触过HashMap的小伙伴都会经常使用put和get这些方法,那接下来就对HashMap的内部存储进行详解.(以初学者的角度进行分析)-(小白篇) 当程序试图将多个 ...
- java map原理_Java HashMap底层原理分析
前两天面试的时候,被面试官问到HashMap底层原理,之前只会用,底层实现完全没看过,这两天补了补功课,写篇文章记录一下,好记性不如烂笔头啊,毕竟这年头脑子它记不住东西了哈哈哈.好了,言归正传,今天我 ...
- HashMap底层原理分析(put、get方法)
1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...
- java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...
概述 JVM 的内存模型和 JVM 的垃圾回收机制一直是 Java 业内从业者绕不开的话题(实际调优.面试)JVM是java中很重要的一块知识,也是面试常问的问题之一,直至今天,仍然还有许多面试者在被 ...
- 深度解剖HashMap底层原理
HashMap底层原理 写在前面 JDK1.7版本--HashMap java.1.7源码分析 new一个HashMap实例的存储流程图如下: API常用方法 API中重要的变量 第一步:申明一个Ha ...
- 我向面试官讲解了hashmap底层原理,他对我竖起了大拇指
前言: 正值金九银十的黄金招聘期,大家都准备好了吗?HashMap是程序员面试必问的一个知识点,其内部的基本实现原理是每一位面试者都应该掌握的,只有真正地掌握了 HashMap的内部实现原理,面对面试 ...
- Java CAS底层原理
Java CAS底层原理 Java CAS底层原理,这一篇就够了!!! CAS全称(Conmpare And Swap)比较并交换,是一种用于在多线程环境下实现同步功能的机制.CAS 操作包含三个操作 ...
- Java异常基础+原理解析+自定义异常
Java异常基础+原理解析 1.什么是异常呀? 程序中的异常就好比人生病了,即再程序的运行过程中.出现非正常的情况,导致jvm非正常终止终止 异常的体系: 异常的的根类为java.lang.Throw ...
- Java集合—HashMap底层原理
原文链接:最通俗易懂搞定HashMap的底层原理 HashMap的底层原理面试必考题.为什么面试官如此青睐这道题?HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好o ...
- HashMap底层原理全解析
作为面试中的高频题目,我相信每一个java程序员都有必要搞懂HashMap的底层原理和实现细节,废话不多说直接开撸. 首先简单说一下HashMap的实现原理: 首先有一个Node<k,v> ...
最新文章
- Gnuplot安装避坑
- 砂.随笔.三十一.息斯敏
- cocos2dx 学习代码记录
- Scenario 7 – HP C7000 VC FlexFabric Tunneled VLANs and SUS A/A vSphere
- SAP Gateway service language determination
- python如何退出模块_如何将一个 Python 函数进行模块化封装
- TypeError: ‘RClass‘ object is not callable, TypeError: ‘CClass‘ object is not callable
- 单相功率因数校正PFC电路的simulink仿真(从电路图搭建到C语言实现PID控制)
- mysql redo,MySQL 8.0 redo log的深入解析
- Operator基础:1: Operator Framework简介
- mysql 报broken pipe_Mysql Broken pipe错误
- 一文解读Masked Autoencoder(MAE)
- 数字翻译成英语JavaScript
- 10个优秀的Golang开源库类,武装生产力
- 解忧云SMS短信服务平台系统 短信发送系统源码 全解密随时可以二开无后门
- 微信账号和语音文件的结构分析
- Lua 实现Get Set属性
- iOS运行时Runtime浅析
- 【笔记】操作系统(六)——进程同步
- MHD-UH40RK4K高清视频会议摄像头
热门文章
- Bootstrap模板-Inspinia.2.9.2
- Redis 命令 - 在线参考
- atheros 9531 uboot spi flash 32m支持
- 亿图图示上线小程序,MindMaster移动端迎来大更新,亿图软件八周年再出发
- TextCNN pytorch实现
- halcon相机标定助手_Halcon教程之单相机标定
- OpenPose安装(gtx1650+cuda10.1+cudnn7.6.0+anaconda3)
- HTTP报文-请求方式
- gms2游戏移植linux,GMS卡刷包制作
- 第八讲 函数直接展开成幂级数