HashMap源码分析(五)读取和删除元素源码分析

HashMap源码分析(五)读取和删除元素源码分析

首页枪战射击源代码删除更新时间:2024-05-11
一、获取元素

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