HashMap之treeifyBin
前提作用业务逻辑整理源码分析getTreeNodefind
前提
jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法
作用
根据key查找树结构中与之一致的对象
业务逻辑整理
1,获取根节点2,从根节点开始循环
2.1,如果当前对象的key与查询的key一致,则返回,否则判断下一个循环节点是右子节点还是左子节点2.2,继续循环,直到找到对象,或者为空
源码分析
getTreeNode
final TreeNode
<K,V> getTreeNode(int h
, Object k
) {
return ((parent
!= null
) ? root() : this).find(h
, k
, null
);
}
find
final TreeNode
<K,V> find(int h
, Object k
, Class
<?> kc
) {
TreeNode
<K,V> p
= this;
do {
int ph
, dir
; K pk
;
TreeNode
<K,V> pl
= p
.left
, pr
= p
.right
, q
;
if ((ph
= p
.hash
) > h
)
p
= pl
;
else if (ph
< h
)
p
= pr
;
else if ((pk
= p
.key
) == k
|| (k
!= null
&& k
.equals(pk
)))
return p
;
else if (pl
== null
)
p
= pr
;
else if (pr
== null
)
p
= pl
;
else if ((kc
!= null
||
(kc
= comparableClassFor(k
)) != null
) &&
(dir
= compareComparables(kc
, k
, pk
)) != 0)
p
= (dir
< 0) ? pl
: pr
;
else if ((q
= pr
.find(h
, k
, kc
)) != null
)
return q
;
else
p
= pl
;
} while (p
!= null
);
return null
;
}