1、存储结构
HashMap存储结构如下图:
上边这个图画的有点小问题,其实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。