HashMap简析

1、存储结构

        HashMap存储结构如下图:

HashMap简析_第1张图片

        上边这个图画的有点小问题,其实table实际存放的只是Entry引用的列表而已,并不是一个个Entry对象,类似C/C++里的指针列表,后边链表里边的才是一个个Entry对象实体。

2、知识要点

1)table(Entry[])的长度是2的幂次:

        主要为了index计算效率,由index = hash(key) & (table.length-1) 代替index = key.hash() % table.length

        (可能有其它的作用,暂时没有想到或看到其它的文档有说明)

2)为什么Java对象在修改equals()方法实现后,对应也需要修改hashCode()方法:

        HashMap插入流程:

        a. 通过key.hashCode()来定位key对应Entry所在的链表

        b. 通过equals()遍历链表中指定key对应的Entry;

        c. Entry为空则插入新的key-value(Entry<keyType, valueType>);

        如果对象equals()比较相同,但是因为key.hashCode()不同导致定位到不同的Entry链表,这时再通过equals()遍历链表查找不到业务上相同的key的Entry,这时HashMap中就会插入业务上应该相等的两个key。

你可能感兴趣的:(HashMap,HashMap结构)