常见的问题
一:
答:1.7是数组+链表,同时1.7是头插法一个一个添加
1.8是数组+(链表和红黑树),同时1.8是尾插法
原因:为了防止1.7时多线程的链表死循环
二:
答:
1.链表过长会影响性能,如果用红黑树就会降低对性能的影响,计算加快
2.如果链表中只有1个或者2,3个值得时候用红黑树会影响性能没必要,只有链表长的时候效果才明显,如非必要不要转为红黑树
3.避免Dos攻击,防止超长链表导致系统性能下降,同时选择阈值为8就是为了让树化几率变小
4.满足两个条件(1.链表长度超过树化阈值8 ,2.整个数组长度≥64) 此时可以变成树
5.在拆分树的时候 如果树元素个数≤6时会退化成链表,remove树节点时,若树的左边或者右边再或者左边的左边有一个为null,也会退化成链表
三:
答:
1.调用HashMap的hash()方法进行二次哈希,最后&(当前链表长度-1) 或者%(当前链表长度-1)
eg:链表长度为64 元素为a 则a的索引为 a的hash值=97 索引=97&(64-1)或者97%(64-1)
前提:你的链表长度必须是2的n次幂
2.二次hash()是为了综合高位数据让哈希分布的更为均匀
3.数组的容量为2的n次幂可使取模效率更高,因为用位与运算代替了取模,当扩容后元素的哈希值为0时,要么留在原位置要么就旧位置+oldCap