HashMap get
方法执行逻辑分析
HashMap - 核心原理与知识点记录(上)
HashMap - 核心原理与知识点记录(中)
1. get
方法的源码分析
public V get(Object key) {
Node<K,V> e;
// 计算出 hash 值
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
final Node<K,V> getNode(int hash, Object key) {
Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
// table != null
// tab.length > 0
// tab[(n - 1) & hash] != null
// 以上的条件是确定当前的 hash 对应下标下的node不为null
if ((tab = table) != null && (n = tab.length) > 0 &&
(first = tab[(n - 1) & hash]) != null) {
// 如果桶的第一个就是当前的 key,那么直接 return 当前值
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;
}
2. 总结
HashMap
的 get
方法主要就是根据 key
的 hash
值查看在哪个桶里,根据不同的数据类型采取不同方式的遍历得到结果
由此,HashMap
源码的分析就此结束,本系列文章是由我对源码阅读后自己的理解书写的,如有偏差请联系博主做出修改
感谢大家的阅读和支持,我会继续努力写出更高质量的文章.