********本篇主要介绍了HashMap源码中get方法部分********
下面展示关于 get方法的
HashMap底层源码
。
public V get(Object key) {
Node<K,V> e;
//先调用hash(key)计算hash值,然后调用 getNode方法
//如果不为null,就返回该节点的value
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
– 上述代码中的hash(key)方法名为扰动函数,我在put篇中有详细讲:扰动函数
– 仔细看,get方法中只是套了一个getNode方法,所以让我们接着探究一下getNode方法的源码👇👇👇
getNode源码比较简单,详细看我写的注释~~👇👇
final Node<K,V> getNode(int hash, Object key) {
//tab:引用当前table的散列表
//first:某个桶位中的头元素
//e:临时node元素
//n:table数组长度
Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
//判断table不是空的且table数组长度大于0,并且first不为null
if ((tab = table) != null && (n = tab.length) > 0 &&
(first = tab[(n - 1) & hash]) != null) {
//如果桶中头元素的hash值==传进来的key的hash值,并且两个key都相等,就返回当前头节点,说明这个头结点就是我们要的
if (first.hash == hash && // always check first node
((k = first.key) == key || (key != null && key.equals(k))))
return first;
//如果头节点的下一个节点不是null,也就说明已经树化或者链化了
if ((e = first.next) != null) {
//如果已经树化,就调用树的查找方法
if (first instanceof TreeNode)
return ((TreeNode<K,V>)first).getTreeNode(hash, key);
//如果是链表,就遍历进行判断
do {
//如果链表中的节点的hash值和传进来的hash值相同,key也相同,那么这个node就是我们要找的node节点
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
} while ((e = e.next) != null);
}
}
//都没有就返回null
return null;
}
本博客仅供学习参考,也是个人笔记总结,如果错误请见谅~~