HashMap之treeifyBin
前提作用业务逻辑整理源码分析getgetNode
前提
jdk1.8之前HashMap的存储方式:链表+hashjdk1.8以后中HashMap的存储方式:链表+hash+红黑树算法
作用
根据key查找与之一致的对象,并返回对象的value值
业务逻辑整理
1,table不能为空,长度要大于0,根据key计算出对应的下标,该下标下的对象不能为空,否则返回空2,该下标对象(frist)的key与查找的可以是否一致,如果一致,则返回当前对象3,frist的下一位对象是否为空,如果为空,则返回空,4,判断frist是否为树结构5,如果为树结构,则调用getTreeNode查找对象6,如果是链表结构,则循环链表,对比key,如果有一致的,则返回该对象,否则返回空
源码分析
get
public V
get(Object key
) {
Node
<K,V> e
;
return (e
= getNode(hash(key
), key
)) == null
? null
: e
.value
;
}
getNode
final Node
<K,V> getNode(int hash
, Object key
) {
Node
<K,V>[] tab
; Node
<K,V> first
, e
; int n
; K k
;
if ((tab
= table
) != null
&& (n
= tab
.length
) > 0 &&
(first
= tab
[(n
- 1) & hash
]) != null
) {
if (first
.hash
== hash
&&
((k
= first
.key
) == key
|| (key
!= null
&& key
.equals(k
))))
return first
;
if ((e
= first
.next
) != null
) {
if (first
instanceof TreeNode)
return ((TreeNode
<K,V>)first
).getTreeNode(hash
, key
);
do {
if (e
.hash
== hash
&&
((k
= e
.key
) == key
|| (key
!= null
&& key
.equals(k
))))
return e
;
} while ((e
= e
.next
) != null
);
}
}
return null
;
}