HashMap(1.8)理解
先放一个流程图了解一下HashMap的put()操作:

1.HashMap底层采用数组、链表、红黑树来实现。
2.表的长度一定是2^n(便于快速计算hash值和扩展),若初始化时指定容量不满足,则HashMap会自动将容量变为2^n。
3..计算hash值的方法:基于key的hashcode,将低16位与高16位进行异或运算。然后与(length-1)做&运算,得到index值。(null的hashCode为0,所以HashMap所允许的唯一null键,存放在table[0]中)
4.HashMap内没有直接的capacity变量,可通过table.length获得。初始时指定的capacity会先赋值给threshold,然后再乘以负载因子(默认0.75)得到新的threshold。
5.HashMap在第一次put()操作的时候开辟table[]数组,而不是在new HashMap的时候,默认大小为16。
6.当size超过threshold时会自动进行扩容,将length和threshold都翻倍。
7.当HashMap扩容后,将oldTable中的元素迁移到newTable中,分为以下几种情况:
1)oldTable[i]中只有一个元素:直接放入newTable的指定位置(newTab[e.hash & (newCap - 1)] = e;)。
2)oldTable[i]是一个红黑树节点:左子树继续保留在newTable[i]的位置上,右子树放在newTable[i+oldCapacity]位置上。若钱以后树的长度小于6,则转化为链表。
3)oldTable[i]是一个链表:通过条件((e.hash & oldCap) == 0)将链表分为两半,一部分保留在newTable[i]的位置上,另一部分放在newTable[i+oldCapacity]位置上。
8.桶中是链表,添加新节点,如果达到了TREEIFY_THRESHOLD,需要检查是否要转换为红黑树结构,treeifyBin()会检查桶数组的大小是否超过MIN_TREEIFY_CAPACITY(64),不超过只是进行resize扩展,否则才转换树。
9.get()操作时,会先比较key的hash值,后将map中的key和要查询的key做equals(),若相同,则取出该key所对应的value。hash和key本质上是key的hashCode和equals方法的应用,hashCode不相等,equals必然不相等,hashCode相等再检查equals是否相等。
10.红黑树是搜索树,因此需要节点是有序的,但是HashMap的类型参数没有Comparable的限定,因此当key对象类型未实现Comparable接口,将使用这个对象的原始hashCode(即Object的hashCode,无论有没有覆盖hashCode方法,null的hashCode为0)。
HashMap(1.8)理解的更多相关文章
- hashMap 临界值初步理解
import java.util.*; public class Bs { //Integer.highestOneBit((number - 1) << 1)分解 public stat ...
- HashMap源码理解一下?
HashMap 是一个散列桶(本质是数组+链表),散列桶就是数据结构里面的散列表,每个数组元素是一个Node节点,该节点又链接着多个节点形成一个链表,故一个数组元素 = 一个链表,利用了数组线性查找和 ...
- HashMap浅入理解
HashMap不能保证元素的顺序,HashMap能够将键设为null,也可以将值设为null,与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设为 ...
- java集合: jdk1.8的hashMap原理简单理解
HashMap的数据结构 HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,他的底层结构是一个数组,而数组的元素是一个单向链表.HashMap默认初始化的是一个长度为16位的数 ...
- HashMap的工作原理深入再深入
前言 首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类): equals:是否同一个对象实例.注意,是 ...
- 深入Java集合学习系列:HashMap的实现原理--转
原文出自:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html 1. HashMap概述: HashMap是基于哈希表的Ma ...
- 面试题 HashMap 数据结构 实现原理
数据结构 HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O ...
- 转:深入Java集合学习系列:HashMap的实现原理
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的).此实现提供所 ...
- HashMap底层实现原理
HashMap底层实现 HashMap底层数据结构如下图,HashMap由“hash函数+数组+单链表”3个要素构成 通过写一个迷你版的HashMap来深刻理解 MyMap接口,定义一个接口,对外暴露 ...
随机推荐
- CentOS 7下安装GUI图形界面
https://www.linuxidc.com/Linux/2017-03/141465.htm
- 【XAF问题】如何判断这个对象的进出类型
一.问题 1. 如何判断这个对象的进出类型 二.思路 第一次进过的时候,存个字段在对象的字段,例如已经过了就给他true,再回来就是false,再过去就true 三.方法 在 A_rfidperson ...
- uva 10288 gailv
Problem F Coupons Input: standard input Output: standard output Time Limit: seconds Memory Limit: MB ...
- 学号20175212 《Java程序设计》第7周学习总结
学号20175212 <Java程序设计>第7周学习总结 教材学习内容总结 8.1.String类 可以使用String类声明对象并创建对象,例如: String s = new Stri ...
- 浅谈C++的智能指针
我们使用智能指针来自动运行管理内存,避免对原始指针的使用不当而造成内存泄漏. ------------------------------------------------------------- ...
- JS中的作用域(一)-详谈
本篇文章在于详细解读JavaScript的作用域,从底层原理来解释一些常见的问题,例如变量提升.隐式创建变量等问题,在和大家一起交流进步的同时,也算对自己知识掌握的记录,方便以后复习 首先,直接捡干的 ...
- MVP之高级MVP架构封装
MVP之高级MVP架构封装 No MVP: 我们一般会这样写: public class MainActivity extends AppCompatActivity { private EditTe ...
- VMProtect1.63分析
教材上给出了一些说明,虽然是断断续续的.. ..之后通过单步,把断的地方都连起来了,也明白了VMP分析插件究竟做了些什么.. //表1,表2在最后. 加密之前的代码: INC ECX C3 RETN ...
- python-并发初学
一.操作系统简单介绍 1.多道技术:(重点)系统内可同时容纳多个作业.这些作业放在外存中,组成一个后备队列,系统按一定的调度原则每次从后备作业队列中选取一个或多个作业进入内存运行,运行作业结束.退出运 ...
- 举例跟踪linux内核系统调用
学号351+ 原创作品转载请注明出处 + 中科大孟宁老师的linux操作系统分析: https://github.com/mengning/linuxkernel/ 实验要求: 编译内核5.0 qem ...