HashMap特性和put原理

HashMap的特点
1、存储无序
2、可以null键null值
3、键值是唯一的不会重复
4、jdk1.8之前是链表+数组 1.8后的链表+数组+红黑树
5、阈值(边界值)> 8 并且数组长度大于 64,才将链表转换为红黑树,变为红黑树的目的是为了高效的查询。

HashMap主要是用来处理键值对形式的数据
HashMap是基于哈希表队Map的一种实现
其中有loadFactor负载因子 默认值是0.75
threshold表示能容纳的键值对的临界点 计算公式是数组长度*负载因子
size是HashMap中实际存在的键值对数量
modCount字段用来记录HashMap内部结构发生改变的次数
并且HashMap有一个默认的长度叫做INITIAL_CAPACITY为16

HashMap采用了数组+链表 在jkd1.8之后加入了红黑树
HashMap的数组部分称为哈希桶 当链表长度大于8且key的数量大于64时时用红黑树存储数据并且在小于6的时候使用链表来存储

每个Node节点存储的数据是:计算出来的hash值,Key,Value,下一个节点的Node<Key,Value> next;
Node是HashMap的内部类,实现了Map.Entry的接口,本质也是一个键值对

put:
在存储数据的时候要计算要存储在Hash桶中的位置
1、先调用hashCode()方法获取key的hashCode值
2、然后进行高位运算 将算出的hashCode右移16位 获取高16位
3、与原hashCode的低16位进行异或运算
4、最后将取得的hashCode值-1进行与运算 取得该对象的存储保留位(也就是下标)

put - 扩展:
当插入已有key的不同value时 例如已有<a,CCC>  再次put一个<a,BBB>的时候 将新的值赋值给a,当插入对象大小超过临界点值的时候
HashMap将新建一个Hash桶数组 并重新赋值(jdk1.7和1.8的赋值方式不同)

猜你喜欢

转载自blog.csdn.net/GSl0408/article/details/130113894
今日推荐