1:HashMap的工作原理是什么?
(1)1.8以前,采用头插法,多线程环境下会造成扩容死锁,HashMap的数据结构是:数组+链表
(2) 1.8以后,采用尾插法。HashMap的数据结构是:数组+链表+红黑树,当链表长度大于等于8(根据统计概率选择的),且数组长度大于64由链表变成红黑树。当链表长度小于6,由红黑树(0log(n)变成链表,负载因子为0.75的时候,碰撞概率最低,但HashMap依然不是线程安全的。
2.解决Hash冲突的时候,为什么不可以直接用红黑树,而选择先用链表,再转红黑树,如果不用红黑树,可以用二叉树查找吗?
(1)红黑树需要左旋,右旋,变色一系列操作来保持平衡,而单链表不需要,当元素个数小于8,使用单链表,大于8,需要红黑树(Olog(n)来提升查询速率,链表的时间复杂度为O(n).
(2)可以,但二叉查找树在特殊情况下会变成 线性结构,遍历查找会很慢
3.hashmap中key值的存储索引是怎么计算的?
(1) 根据key值计算出Hashcode值,根据hashcode值计算出hash值&