2019-11-15

HashMap 初始容量是16  负载因子是0.75

第一次创建map是空的 只有put的时候才会默认16个

什么时候扩容:当hasmap中的元素个数超过数组大小* 负载因子的时候就会扩容 resize

数组的大小扩展为 2* 16 =32  即扩大一倍。然后重新计算每个元素在数组中的位置。

当前数组的长度乘以负载因子的  默认长度16* 0.75=12


hashmap的长度为什么是2的n次方:提高存取效率。2 的n次方实际就是1后面n个0,2的n次方-1 实际就是n个1

计算数组下标

staticint indexFor(int h,int length) {

return h & (length-1);

    }

例如长度为9时候,3&(9-1)=0  2&(9-1)=0 ,都在0上,碰撞了;

例如长度为8时候,3&(8-1)=3  2&(8-1)=2 ,不同位置上,不碰撞;


HashMap 为啥是线程不安全的:hashmap 生成的链表在jdk1.8 之前是插入头部的,在之后是插入尾部的。 put的时候导致多线程数据不一致,get的时候可能因为resize而引起死循环  cpu100%


java1.8前  原理是 数组+链表    就是链表散列的结构  

java1.8后 原理是数组+链表/红黑树 若桶中链表元素个数大于等于8时,链表转换成树结构;

你可能感兴趣的:(2019-11-15)