Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
这个是get方法,首先创建一个Node临时变量,然后将Node赋引用为getNode方法的返回值,判断Node是否为空,如果为空就返回空值,否则就返回Node的value。
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 && // always check first node
((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;
}
getNode方法返回指定节点,接收两个参数,一个是键的hash值,另一个是键本身。
首先创建几个临时变量,其中有Node数组tab,有Node类型的first和e,有int类型的n,有键类型的k。
然后将底层数组table赋引用给tab,判断tab不为空,然后将tab的长度赋值给n,判断n大于0,然后将first赋值为tab的第一个元素,赋值的方式比较有意思,取得是n-1和hash参数的按位与结果为下标的底层数组元素,然后判断fist是否不为空。这些条件全部成立的话,继续判断。
判断first的hash值和参数的hash值是否相等,然后判断下两个条件中有一个是否成立,那就是1将k赋引用为first的key属性,2key参数不为空且key和k是否equals,其实就是判断key参数和first的key属性是否相等或equals。如果上述判断成立,那么就返回first元素。
如果没有返回,再将e赋引用为first的下一个元素,然后判断下一个元素是否不为空,如果不为空,继续进入判断。
判断first是不是TreeNode,TreeNode就是将HashMap的整体结构转换为红黑树后的节点结构。如果是TreeNode就调用TreeNode类的getTreeNode方法返回。
如果没有返回,就进入do while循环,条件是e赋引用为e的next元素,然后判断e是否不为空。循环体里判断如果e的hash是否和hash参数相等,且e的key和参数key是否相等或equals,如果判断成立就返回e。
如果还是没有返回,就返回null。

2070

被折叠的 条评论
为什么被折叠?



