面试必考:HashMap的内部结构

HashMap的数据结构

    HashMap是一个很是有意思的结构, 它的整个结构是一个数组+链表的结构(当一个链表中的元素过多会从新调整成一个红黑树,这是1.7版本进行的一个改进)。java

    从字面上讲,HashMap是一个map,就是一个映射性质的集合。它的一个主要功能是计算一个对象的hash值,而后经过这个hash值来直接寻找这个对象。算法

    经过映射的方式来查找对象,时间复杂度是O(1)。数组

HashMap是怎样存储数据的数据结构

    在进行建立一个HashMap的时候,若是没有向构造函数传递一个Integer的参数,那么这个HashMap的默认大小就是16,在源码中的表现是以下:    函数

/**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    这个数字会在进行hash分组的时候会用到。spa

    当向HashMap中放入一个对象的时候,即执行put(key,value)的时候,先会对放入的key对象进行hash值的计算,在计算完成以后会获得一个int的hash值,再经过这个hash值对这个HashMap的容量(以前有说,默认容量是16)进行求余的操做,在java中是这样进行的:code

(n - 1) & hash

    其中,n是HashMap的容量,这个操做等价于hash%n。在取到了这个余数以后,就获得了这个对象要放到数组的哪一个槽位里。在肯定了放到哪一个槽位里以后,会拿放入的value值与这个槽位里全部的对象用equals方法进行比较:对象

    1.若是全部的对象都与value值不同,则把这个对象放到链表的最后 ci

    2.若是在遍历的时候有对象与value相等,那么就把传入的对象替换它相同的对象源码

    这样的过程以后 ,就完成了对一个对象的放入。在这个过程当中,须要注意一点:由于是先按hash分组再按equals进行存放,因此两个对象若是相等,就必定要放到数组的同一个槽位里,若是不这样作,就可能出现同一个对象出现两次,而HashMap中的全部对象都是按照hash算法获得hash值再处理的,因此没有任何的顺序可言,相同的对象是不能出现两次的。因此有了如下的结论:

    两个对象相等,就必定有相同的hash值,有相同hash值的对象不必定相等。这也是咱们重写对象的hashCode()方法和equals()方法的时候须要注意的事项。

相关文章
相关标签/搜索