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接口,定义一个接口,对外暴露 ...
随机推荐
- JVM调优(一)
JVM调优的主要过程有: 确定堆内存大小(-Xmx, -Xms).合理分配新生代和老生代(-XX:NewRation, -Xmn, -XX:SurvivorRatio).确定永久区大小: -XX:Pe ...
- ansible如果兼容Centos5
基本安装 安装gcc,用于编译python源码 yum install gcc 更新python版本 centos自带python2.6版本,由于centos已对python深度依赖,所以更新pyth ...
- JSON的新方法--parse()和stringify()
// eval 可以解析任何字符串变成js var str = 'function show() {console.log(1)}'; eval(str); show(); // parse 只能解析 ...
- __FILE__、__DIR__区别
__FILE__=D:\Soft\xampp\htdocs\test\test.php __DIR__=D:\Soft\xampp\htdocs\test getcwd()=D:\Soft\xampp ...
- FPM六:接五,跳转到明细
1.在RESULT的Feeder class里添加点击单号事件: method IF_FPM_GUIBB_LIST~GET_DEFINITION. DATA:GW_ACTION TYPE FPMGB_ ...
- PowerDesigner数据库设计导出到Excel
在PowerDesigner 中 ctrl+shift+x 弹出执行脚本界面,输入如下代码就会生成 Excel Option Explicit Dim rowsNum rowsNum = '--- ...
- [cf contest697] D - Puzzles
[cf contest697] D - Puzzles time limit per test 1 second memory limit per test 256 megabytes input s ...
- ES6/ES7/ES8常用特性和新特性
转自:https://www.jianshu.com/p/9da4aa1c9970
- Vue 给axios做个靠谱的封装(报错,鉴权,跳转,拦截,提示)
需求及实现 统一捕获接口报错 弹窗提示 报错重定向 基础鉴权 表单序列化 用法及封装 用法 // 服务层 , import默认会找该目录下index.js的文件,这个可能有小伙伴不知道可以去了解npm ...
- docker 安装redis , 让宿主机可以访问
1, docker 拉去最新版本的redis docker pull redis #后面可以带上tag号, 默认拉取最新版本 2, docker安装redis container 安装之前去定义我们的 ...