1、jdk1.8之前底层是由位桶和链表实现,1.8以后采用位桶+链表+红黑树实现。当链表长度超过8时候,将链表转为红黑树。
2、首先有一个数组,当添加一个元素时候,首先计算元素key的hash值,以此确定在数组中的位置,但是可能存在重复的情况,
这时候就添加到同一个hash值的后面,但是这时候的元素是个链表,当链表超过一定长度后就转为红黑树。所以同一个链表内 数据的hash值是相同的。
3、初始容量是16 最大容量是2的n次方(不超过30)
4、扩容机制
5、put过程:1、对key进行hash,然后计算在数组中的index 2、如果没有碰撞直接放入。3、如果碰撞了,放入链表中存入数组。 4、如果节点已经存在,替换原来的节点。5、如果超过预定阈值,进行resize扩容。
6、get 过程:通过key的hashCode()进行hashing, 计算下标,从而获得位置信息,如果有碰撞,利用key.equals()方法去链表中 查询。
7、解决hash冲突的方法:开放定址法,链地址法。