一、获取hash
HashMap在put方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。
二、索引下标位置元素为空
如果索引下标位置元素为空,则将key和value封装为对象,jdk1.7封装成entry对象,jdk1.8封装成node对象,插入到当前位置
三、索引下标位置元素不为空
1、jdk1.7版本时
jdk1.7的hashmap的数据结构为数组加链表,当hash冲突即下标元素不为空时,先判断是否需要扩容,如果需要就先扩容,如果不需要,则生成entry对象,使用头插法插入到链表当中。
2、jdk1.8版本时
jdk1.8的hashmap的数据结构为数组加链表加红黑树,在进行put方法的时候,会判断当前索引下标位置的node对象的类型,是链表node还是红黑树node。
如果此位置的node对象是链表node,则使用尾插法将key和value封装为一个链表node插入链表,插入之前需要遍历链表,遍历链表的过程中会判断是否存在当前key,如果存在则更新value,如果不存在则遍历完链表,将node对象插入到链表的最后位置,插入后会看到链表的节点数,如果节点数大于8,则会将链表转化成红黑树。
如果此位置的node对象是红黑树node,则将key和value封装成红黑树node,放入红黑树的节点中,整个过程会判断是否存在当前key,如果存在则更新value。