基于JDK1.8
//get方法
public V get(Object key) {
Node<K,V> e;
//根据key的hash值和key寻找Node,如果为null则返回null,如果不为null则返回value
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;
//如果 tab部位null 并且 tab数组中有元素 并且 要查找的hash & (n-1) 在tab中存在
if ((tab = table) != null && (n = tab.length) > 0 && (first = tab[(n - 1) & hash]) != null) {
//判断如果hash和key都相同则返回该元素(返回的是tab数组中的节点元素,下面的判断才是链表里面的)
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 {
//循环查找结点的下一个,直到找到hash和key同时相同的节点,返回改节点
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) {
return e;
}
//用于循环判断下一个节点
} while ((e = e.next) != null);
}
}
return null;
}