前言
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更加占空间了
红黑树退化成链表
第一种情况是正对扩容的情况导致的退化
第二种退化情况是针对移除元素时的操作要在移除前判断