hashmap初始容量2的n次幂的原因?hash算法?hashmap扩容形成环的原因?1.7与1.8的区别?
不清楚;hash算法不了解;不了解;区别:头插法的修改;
HashMap初始容量为什么是2的n次幂及扩容为什么是2倍的形式_扯淡吧 Pino曹的博客-CSDN博客
0、java1.7中扩容为什么会形成环?
源码中调用put方法的时候 会判断,当前map的size和初始容量的0.75倍相比,如果等于这个值,则需要进行扩容,
扩容的时候需要进行 旧数组转移到新数组的操作。形成环的操作就在转移过程中 因为hashmap是线程不安全的,
多线程进行扩容操作时,就可能会形成环。
1.7
jdk1.8,避免形成环, 下面定义了四个指针,一组高位,一组低位。
分成两组后 高低位切换,没有重新进行rehash ,而是直接把链表断掉,进行几乎均等的拆分,分为两段。
低位还在之前的位置,高位就放在原来的位置加上扩容的长度的位置,这样就不会形成环。
但是仍然不能解决线程安全问题。 于是就会想到concurrentshashmap
1、hashmap初始容量2的n次幂的原因?
2的n次幂的原因是因为位运算比取模效率高,所以选择按位与
要保证(hash%length)= h & (length -1)
2、加载因子为什么是0.75
hashmap&concurrenthashmap原理详解-前美团的兄嘚带你一起面试_哔哩哔哩_bilibili
loadfactor:如果是1 则提高了 hsah碰撞的几率 最大化利用空间
loadfactor:如果=0.5 链表长度很短 查询效率很高 节省时间提高效率,但是浪费空间
所以折中取0.75 经验值
3、jdk1.8中为什么链表长度为8的时候 变成红黑树
泊松分布 统计学公式 当链表长度为8时 再添加到这个链表上的几率很低 所以产生红黑树的几率也不大