图解HashMap核心方法

1、put方法

调用另一个方法
index=key.hash^(key.hash>>>16)&(n-1)
YES
NO
YES
NO
YES
NO
YES
NO
YES
遍历期间
NO
put(key, value)
putVal(key.hash key, value)
tab==null
resize()
tab[index]==null
newNode(key.hash, key, value)
tab[index].key == key
e=tab[index]
将旧值更新为传入的value
tab[index] instanceof TreeNode
putTreeVal(hash, key, value)
链表是否存在节点的key等于传入的key
检查是否需要树化,binCount >= TREEIFY_THRESHOLD - 1
插入单链表队尾

2、get方法

调用另一个方法
YES
NO
YES
NO
YES
NO
找到
找不到
get(key)
get(hash, key)
tab == null
return null
tab[index].key==key
return tabl[index].value
tab[index] instanceof TreeNode
getTreeNode(hash, key)
链表递归查找节点的key等于传进来的key
return value

3、 resize方法

NO
YES
YES
重哈希并移动到新数组
oldCap>0
初始化数组大小和阈值
newCap = oldCap << 1
Node[] newTab = (Node[])new Node[newCap]
遍历oldTab的每个节点
newTab[e.hash & (newCap - 1)] = e
resize是使用的单链表插入,在put的时候才会检查节点的冲突个数,然后判断是否树化

你可能感兴趣的:(Java集合类,数据结构,java)