笔者一直很好奇HashMap插入、扩容究竟是怎么进行的,专门研究了下JDK1.8的源码,下面专门进行讲解。

       先讲解一下JDK8中HashMap的Key求hashcode的hash算法,较之前JDK7更简单了点:

       JDK8中HashMap源码详解

       求Key的hash值,不就是为了计算出他在HashMap中的index值嘛,如下:

       JDK8中HashMap源码详解



         在没有发生hash冲突的情况下,采用的是(n-1) & hash ,整个过程如下:

     JDK8中HashMap源码详解


       A、插入元素(put)

       1、插入第一个元素:

        JDK8中HashMap源码详解JDK8中HashMap源码详解


    2、故意制造hash冲突,调试由数组+链表转化为数组+红黑树的条件

   JDK8中HashMap源码详解


          由源码可知,数组+链表转化为数组+红黑树的条件是:链表长度大于8并且数组长度大于等于64



相关文章: