HashMap存储结构以下图: spa
上边这个图画的有点小问题,其实table实际存放的只是Entry引用的列表而已,并非一个个Entry对象,相似C/C++里的指针列表,后边链表里边的才是一个个Entry对象实体。 指针
1)table(Entry[])的长度是2的幂次: 对象
主要为了index计算效率,由index = hash(key) & (table.length-1) 代替index = key.hash() % table.length 文档
(可能有其它的做用,暂时没有想到或看到其它的文档有说明) hash
2)为何Java对象在修改equals()方法实现后,对应也须要修改hashCode()方法: table
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。