记录下HashMap
2019-08-16 本文已影响0人
杨大魔王
jdk1.7以下 数组桶 + 拉链法
jdk1.8开始 数组桶 + 拉链/红黑树,
ps:决定拉链还是红黑树(取决于 桶长度 和 拉链长度,需要同时满足)
两个条件, 而转树条件 和 转链表条件 是 8 和 6
这两个值不同, 是因为防止在 数据频繁增加删除,造成频繁的转换操作
桶大小 16 成倍增长
数组桶成长因子 0.75
数组桶中存储的数据 为hashcode 异或 hashcode>>16位 (被称为“扰动”)
为了解决
ex:数据的地址为 100 200 300 桶长为 10 那么求 余数 后得到结果都是 0
但是 >>3位(假装10进制右移)后,再异或原数据,求余数后 得到的结果为 1 2 3 可以使分布更加均匀
因为String的hashcode算法不是内存地址位置,而是String内容的计算结果
所以可以轻易的制造 hashcode相同的String,会使几乎O(1)(一般碰撞很低)的查找
变成O(n)(因为拉链过长)这样使HashMap的效率疯狂下降,而如果效率很低发生在
高并发的服务器中,则有可能造成服务器瘫痪的可能。
为解决以上情况,引入了红黑树逻辑,当拉链过长时,会转换成红黑树。
查找时间优化为 O(log2n)加快了服务进度