方法"/>
java中map的put方法
一、背景
jdk1.8
二、hashMap的put主要流程
1、hash()过程,经历了rehash()
2、执行put流程前的初始化定义,如初始化桶,数组长度等等
3、执行开始,验证桶是否初始化过,如果没有则扩容并重新赋值数组长度
4、通过桶数组长度、hash值的&运算,获取对应的数组下标
5、验证对应链表上的头节点,如果为空,就不用走接下来的逻辑,直接创建节点即可
6、如果不为空,那么确定当前节点已经处于链表上了,那么对头节点进行比较,如果头节点正好是当前值的节点,那么替换值即可.
7、如果头节点不是,需要确认当前链表结构是否为树形结构,即头节点是否为树形节点,如果是树形节点,调用putTreeVal()即可.
8、如果头节点也不是树形节点,那么就有趣了,hashMap会直接来个死循环遍历当前链表,知道获取到相同的节点为止,如果匹配到了,那么就将值进行替换.
9、如果直到尾结点也没有匹配上,说明当前节点在之前不存在,那么hashMap就会为当前值创建一个节点,并且判断是否需要进行树化,如果满足树化条件,那么会对当前链表进行树化.
三、hashMap的源码解析
如果直接看原生的hashMap不好理解,可以换成大家平时编码的方式进行解读,
如下:
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
//执行流程前的初始化定义
//定义桶数组
Node[] tab = table;
//定义当前key对应的节点
Node p;
//初始化数组长度
int n = tab.length;
//开始执行</
更多推荐
java中map的put方法
发布评论