HashMap的结构及源码分析
最近朋友说研究并发可以先从HashMap源码分析开始,所以就研究了下HashMap的结构和源码。
先从HashMap的结构开始。
我们都知道HashMap的用来存储key,value键值对数据的。既然是存储数据的,我们就得想一下数据存储的数据结构信息有哪些,我们所知道的数据存储结构有 数组,链表,树形,图形。数组查询快,增删慢。链表增删快查询慢,我们可以猜猜HashMap什么结构,可不可能是数组加链表相互结合,取两者的优势的结构。也就是数组+链表的结构。
在jdk1.8之前,hashmap的结构确实是数组加链表的,在jdk1.8的时候hashmap结构又进行了优化。由数组+链表的结构转为了在某特定情况的时候链表会转为红黑树的结构。也就是,在jdk1.8之前链表的长度是没有限制的,当数据增多,链表越长,hashmap的效率就会下降。在jdk1.8的时候,链表的长度限制为8,在超过8时,将链表的结构转成红黑树结构,提高效率,当然红黑树的结构也会有限制,节点数最低不能低于6个,当低于6时,会自动转为链表提高效率,这就是jdk1.8时hashMap很神奇的结构变化。
----------下面是分析时的概要理解-----------
我们都知道数据结构,却很少将结构具象化成代码,如下简单尝试一下。
ArrayList ---> 数组 ----> Object [ ]
LinkedList --->双向链表 ---->
class Node{Object Data;//数据Node previous;//上一节点信息Node next;//下一节点信息
}
当然这只是我们将结构想象成java代码的样子,这段代码并不一定是对的。
HashMap的结构及源码分析相关推荐
- 【Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构体源码分析 | zone 结构体源码 )
文章目录 一.内存区域 zone 简介 二.zone 结构体源码分析 1.watermark 成员 2.lowmem_reserve 成员 3.zone_pgdat 成员 4.pageset 成员 5 ...
- HashMap与ConcurrentHashMap万字源码分析
HashMap与ConcurrentHashMap`源码解析 JDK版本:1.7 & 1.8 开发中常见的数据结构有三种: 1.数组结构:存储区间连续.内存占用严重.空间复杂度大 优点:因 ...
- HashMap实现原理及源码分析为何选用红黑树
目录 一.什么是哈希表 二.HashMap实现原理 三.为何HashMap的数组长度一定是2的次幂? 四.重写equals方法需同时重写hashCode方法 五.总结 为什么HashMap使用红黑树而 ...
- HashMap实现原理及源码分析
目录 一.什么是哈希表 二.HashMap实现原理 三.为何HashMap的数组长度一定是2的次幂? 四.重写equals方法需同时重写hashCode方法 五.总结 一.什么是哈希表 在讨论哈希表之 ...
- 【Java集合学习系列】HashMap实现原理及源码分析
HashMap特性 hashMap是基于哈希表的Map接口的非同步实现,继承自AbstractMap接口,实现了Map接口(HashTable跟HashMap很像,HashTable中的方法是线程安全 ...
- redis底层数据结构(redis底层存储结构、源码分析)
文章目录 前言 一.redis为什么快? 二.redis的底层数据结构 2.1.redis的底层存储的扩容机制 2.1.1.扩容时间 2.1.2.扩容多大 2.1.3.扩容后的rehash 2.1.4 ...
- 【阅读源码系列】ConcurrentHashMap源码分析(JDK1.7和1.8)
个人学习源码的思路: 使用ctrl+单机进入源码,并阅读源码的官方文档–>大致的了解一下此类的特点和功能 使用ALIT+7查看类中所有方法–>大致的看一下此类的属性和方法 找到重要方法并阅 ...
- ConcurrentHashMap实现原理及源码分析
ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...
- concurrenthashmap_ConcurrentHashMap实现原理及源码分析
ConcurrentHashMap是Java并发包中提供的一个线程安全且高效的HashMap实现(若对HashMap的实现原理还不甚了解,可参考我的另一篇文章HashMap实现原理及源码分析),Con ...
最新文章
- 三种 MySQL 大表优化方案
- python语言开发的软件有哪些-最适合人工智能开发的5种编程语言,你知道几种?...
- shell实例第16讲:猜拳游戏
- Paper之CV:《One Millisecond Face Alignment with an Ensemble of Regression Trees》的翻译与解读
- OpenGL顶点阵列对象
- C++一天一个程序(一)
- C++远征之封装篇——字符串类型
- java数字时钟代码,[Java教程]Javascript 数字时钟
- webpack4.0各个击破(6)—— Loader篇
- 在iphone开发中的get请求和post请求
- 显示lib包_Java 添加、删除、移动、隐藏/显示Excel工作表
- TShockwaveFlash的安装及其属性和方法
- (13.3)Latex参考文献引用及常规引用
- 前端实习第一周总结(学习上的收获与生活上的收获)
- 布局技巧(等高、圣杯)
- python atm银行取款系统_python ATM机 案例代码
- @Valid使用详解
- 阿里巴巴并购雅虎中国[北京时间8月11日14时]
- 小学计算机课知识点,小学信息技术课程课件
- 用超级简单的C语言实现人机五子棋(键盘控制)
热门文章
- php分解质因数,用PHP如何实现将一个整数分解为质因数的积?
- 前端模式 VD, 脏检查 MVVM ,数据收集 MVVM 所使用的场合
- Java - 计算不同字符或数字的个数
- pyqt5生成py的文件为什么是c 语言,如何使用PyQt5在python中创建文件对话框
- python实例 99,100
- java线程池执行器_Java线程池ThreadPoolExecutor的使用
- 不到30的成本,还不赶紧造起来——盘点软著申请小知识
- 机器学习里面常用知识
- 对于单输入多输出系统matlab,求助!!如何把多输入多输出系统的传函转换为状态空间表达式?...
- oracle将千万行查询优化到一秒内,oracle下一条SQL语句的优化过程(比较详细)