get方法
public V get(Object key) {
Node<K,V> e;
/** 先通过hash方法获取key的hash值,在调用getNode方法获取对应的Node */
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
hash方法
hash值计算原理之前讲解过了,这里就不赘叙了;
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
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) {
/** 判断数组元素是否为查询key,是的直接返回 */
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)
/** 调用红黑树的getTreeNode方法获取元素返回 */
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;
}
二、删除元素
remove方法
public V remove(Object key) {
Node<K,V> e;
/** 获取hash值之后调用removeNode方法删除元素 */
return (e = removeNode(hash(key), key, null, false, true)) == null ?
null : e.value;
}
removeNode方法
final Node<K,V> removeNode(int hash, Object key, Object value,
boolean matchValue, boolean movable) {
/** 设置指针 */
Node<K,V>[] tab; Node<K,V> p; int n, index;
/** 判断数组及索引位置元素是否为空 */
if ((tab = table) != null && (n = tab.length) > 0 &&
(p = tab[index = (n - 1) & hash]) != null) {
Node<K,V> node = null, e; K k; V v;
/** 判断数组位置元素是否为查询元素,并且赋值给nade */
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
node = p;
else if ((e = p.next) != null) {
/** 判断是否红黑树,如果是调用getTreeNode方法查询节点元素 */
if (p instanceof TreeNode)
node = ((TreeNode<K,V>)p).getTreeNode(hash, key);
else {
do {
/** 遍历单向链表获取元素 */
if (e.hash == hash &&
((k = e.key) == key ||
(key != null && key.equals(k)))) {
node = e;
break;
}
p = e;
} while ((e = e.next) != null);
}
}
/** 判断获取元素是否为空,是否为目标元素 */
if (node != null && (!matchValue || (v = node.value) == value ||
(value != null && value.equals(v)))) {
/** 判断是否红黑树,是则调用removeTreeNode方法进行删除 */
if (node instanceof TreeNode)
((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);
else if (node == p)
/** 如果node为p,说明只有一个元素,直接将next赋值给数组节点就好 */
tab[index] = node.next;
else
/** 配置将node的下一个元素赋值给p的下一个元素 */
p.next = node.next;
modCount;
--size;
afterNodeRemoval(node);
return node;
}
}
return null;
}
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved