美文网首页
2019-11-15

2019-11-15

作者: Gxy_8c77 | 来源:发表于2019-11-15 16:25 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/yuqsictx.html