HsahMap的基础原理hashMap是Java语言中最常见的数据结构1、hashMap的数据结构
要理解hashmap,首先需要弄清他的数据结构。 在java编程中,最基本的数据结构有数组和链表两种。
数组:查询速度快,可以基于索引进行查询,但很难插入和删除。
链表:查询速度慢,需要遍历整个链表,但插入和删除相对简单。
HashMap由数组和链表组成,数据结构也称为链表哈希。2.hashmap特点
快速存储—例如,在对混列映射执行get和put操作时,速度非常快,搜索速度也非常快。 (时间复杂性o(1) )如果使用key去一个value,时间复杂性非常低,效率很高,可扩展。 1数组扩展,边长。 2、单线列表长度超过8时为红黑树3.hashmap的Hash算法
在说哈佛算法之前,Java需要知道所有对象都有hashcode (使用密钥)。 使用object对象的get hashcode可以获得指向int类型的手指。 我们在hashmap中主要用他的key来计算那个值。Hash值的计算
Hash值=(hashcode ) ^(hashcode 16 ) ) ) )。
Hashcode赋予Hashcode自身向右移动16位的异或运算。 这样可以确保计算出的值足够随机。 因为在进行混列计算时,计算数组下标时计算的值足够分散,以便充分分散。 如上所述,hashmap的下级层由数组组成,数组的默认大小为16,但是如何计算数组下标,它是:
序列下标: hash(16-1 )=hash
对哈市计算得到的hash进行16的求馀,得到16的位数。 例如,如果是1到15之间的数字,则hashmap将预运算为hash值和15。 这样会更有效率。 在计算机中,很容易识别这种向右位移、向左位移。
Hash冲突
如果不同对象计算的数组后缀相同,则会发生混列冲突。Hash冲突会产生单线链表
单线链表达到一定长度后效率会非常低,但jdk1.8以后加入了红黑树。 也就是说,单线列表达到一定长度时会变成红黑树
Hashmap底层原理扩容
扩展
排列长度变为2倍的0.75
触发条件
数组存储的比率达到了75 %0.75
一下是需要理解的:
Hashmap扩展不是为单线链表准备的,单线链表是为解决hash冲突而准备的。 也就是说,如果排列为一定的长度,例如hashmap的默认排列长度为16,则达到出发条件,在排列存储比率达到75%、即16*0.75=12时容量扩大
红黑树
二叉树,高效的搜索效率
如前所述,当链表达到一定长度时,链表变成红黑树
触发条件
如果链表长度大于8,则将后续数据转换为二叉树红黑树就是上图所示
a下面有两个节点BC,b和c下面有DEF
总结
Hashmap数据结构
数组、单线链表、红黑树(1.8 )。
混洗映射的特点
1、高速存储
2、快速搜索
3、可伸缩Hash算法
为什么要使用hash算法? 在我们Java中,每个对象都有hashcode。 hash算法是hashcode和自己向右移位16的异或运算。 这是因为所计算出的混列值足够随机、足够分散和所生成的数组下标足够随机
还有就是hash冲突
面试中询问了为什么会有hash的冲突
例如,我们也插入数组。 大家算下来就是13号了。 那么,这个时候会发生散列冲突。 为了解决hash冲突,我们的数组将是单线链表。 然后,当我们的单线链表达到一定长度时就会产生红黑树。