HashMap
xsinx
这个作者很懒,什么都没留下…
展开
-
HashMap是头插法还是尾插法
1.JDK8以前是头插法,JDK8后是尾插法2.为什么要从头插法改成尾插法?A.因为头插法会造成死链,参考链接B.JDK7用头插是考虑到了一个所谓的热点数据的点(新插入的数据可能会更早用到),但这其实是个伪命题,因为JDK7中rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置(就是因为头插) 所以最后的结果 还是打乱了插入的顺序 所以总的来看支撑JDK...原创 2019-11-21 11:15:47 · 26021 阅读 · 6 评论 -
hashMap的线程不安全问题
1.写一个hashMap线程不安全的例子Map<String,String> map=new HashMap<>();for(int i=0;i<3;i++){ new Thread(()->{ map.put(Thread.currentThread().getName(),UUID.randomUUID().toString()...原创 2019-11-20 14:01:56 · 152 阅读 · 0 评论 -
HashMap的putVal方法源码解析
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; //该判断就是怕空表导致n=0 if ((tab = table) == null ||...原创 2019-11-19 19:45:45 · 239 阅读 · 0 评论 -
为什么链表的长度是8的时转红黑树?+ 加载因子为什么是0.75?
A.首先需要明确的是:加载因子越大空间利用率就越高,可以充分的利用数组的空间;加载因子越小产生碰撞的概率的就越小,进而查找的就越快(耗时少);简而言之是空间和时间的关系B.为什么链表的长度是8的时转红黑树?+ 加载因子为什么是0.75?根据泊松分布可以得出当加载因子为0.75,链表长度为8时,再加入元素发生冲撞的概率最低...原创 2019-11-20 10:43:01 · 557 阅读 · 0 评论 -
HashMap扩容的问题
A.HashMap的初始容量和扩容都是以2的次方来进行?链接B.HashMap什么时候扩容?达到0.75C.每次扩容的量?每次扩容一倍,初始容量是16,第一次扩容是32,第二次是64...原创 2019-11-19 21:29:35 · 647 阅读 · 0 评论 -
为什么数组的初始长度是2的指数次幂?
1.效率问题:计算数组下标时取模运算的效率低于位运算,在进行扩容时会频繁的进行数组下标的运算2.在计算数组下标时的源码如下static int indexFor(int h,int length){ return h&(length-1);}分析:a.只有当HashMap的length为2的整数倍时,length-1的结果是全1,如HashMap的初始值是16,那么l...原创 2019-11-19 21:26:46 · 569 阅读 · 0 评论