说一下HashMap的put方法的大体流程:
1.根据key通过哈希扰动和路由算法得出数组的下标
2.如果下标对应数组的桶位元素为空,则将key和value封装为Entry对象(JDK 1.7是Entry对象,JDK 1.8是Node对象)并放入对应的桶位
3.如果下标对应数组种的桶位不为空,则分情况讨论:
如果是JDK 1.7,则在添加之前判断是否需要进行扩容,如果不需要则将数据封装成Entry对象,然后使用头插法添加到当前的链表中
如果是JDK 1.8 ,则会判断当前桶位上Node的类型,是红黑树、普通Node还是链表
- 如果是红黑树,就将key、value封装成红黑树结点并添加到红黑树中,这个过程会判断红黑树中是否存在当前key,若存在则替换value值,否则添加
- 如果该桶位是链表,则将key、value封装为Node结点,并遍历链表是否有相同的key,若有则替换value值,否则使用尾插法插入末尾。此过程结束后判断链表结点数是否超过8,超过则树化为红黑树
- 当数据成功添加后,再进一步判断是否需要扩容,之后put方法结束
以上是关于put的大体流程,当然HashMap的put方法中还有很多细节的东西,可以查看我的另一篇博客:JDK 1.8 HashMap源码分析