0
点赞
收藏
分享

微信扫一扫

【java基础】hashmap

前言

hash
任何字符都有一个hash值,一个对象的hash值是唯一确定的
例如查看a的hash值可以使用a.hashcode()来打印a的原始hash值
但是原始hash值并不能作为hashmap的key,还需要一定的算法也就是hash函数来对值进行转换,转换为二次hash值也就是本hashmap所使用的作为key的hash值。
注意:hash值的算法有很多例如希尔与取余还有数字分析法,直接定址法,平方取中法这里我们讨论的是常见的除留余数法。
下面是1.8的hashmap的二次hash
在这里插入图片描述
二次hash会使数据更加均匀分布于桶中。

hashmap

长啥样?
在这里插入图片描述

扩容

factor是装填因子,是map扩容的依据。上图放第13个数据触发扩容
hashmap的扩容是成倍扩容
16 32 64

hashmap的优势是可以通过《计算hash函数》这一步骤避免盲目顺序查找

jdk8红黑树

避免链化过长,于是树化。
树化阈值为8且数组长度不小于64。
长啥样?
在这里插入图片描述
左小右大,其实就是折半查找的判定树,相同颜色的节点还要满足平衡树的条件。
当我们删除元素时可能需要调整平衡性
这些都是为了能够更加高效的查找。

红黑树的缺点是treenode更加占空间了

红黑树退化成链表

第一种情况是正对扩容的情况导致的退化
第二种退化情况是针对移除元素时的操作要在移除前判断
在这里插入图片描述

举报

相关推荐

0 条评论