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时,链表转换成树结构;
网友评论