HashMap源码学习(三)
2020-05-11 04:08
218 查看
HashMap源码学习(三)
HashMap removed删除操作
public V remove(Object key) { Node<K,V> e; return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value; } /** * Implements Map.remove and related methods * * @param hash hash for key * @param key the key * @param value the value to match if matchValue, else ignored * @param matchValue if true only remove if value is equal * @param movable if false do not move other nodes while removing * @return the node, or null if none */ 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) { //元素存储的位置p = tab[index = (n - 1) //判断传入的数组是否空,数组长度大于零,以及要删除的位置上不为空。 Node<K,V> node = null, e; 定义两个键值对node,e K k; V v; //hash没冲突 //判断hashmap上的hash值以及key是否相等 //相等则将P赋值给node if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) //定位要删除的node节点 node = p; //hash有冲突 else if ((e = p.next) != null) { //判断时候有next为了判断是树类型或者链表类型 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); } } //获取删除节点node之后执行删除操作 //如果node不为空,!matchValue 为true if (node != null && (!matchValue || (v = node.value) == value || (value != null && value.equals(v)))) { //判断node为树 数的删除 if (node instanceof TreeNode) ((TreeNode<K,V>)node).removeTreeNode(this, tab, movable); //removeTreeNode(this, tab, movable)删除数的方法 //链表的删除 else if (node == p) //p = tab[index = (n - 1) & hash] 确定要删除的元素 //node=p node要删除的元素 //删除头节点 //就是删除的元素的下一个节点的元素连接删除元素之前的元素,断开删除元素的链 tab[index] = node.next; //链表删除操作 else //不是头节点,将当前节点指向删除节点的下一个节点 //就是删除的元素的下一个节点的元素连接删除元素之前的元素,断开删除元素的链 p.next = node.next; ++modCount; --size; afterNodeRemoval(node); return node; } } return null; }qintaipeng 原创文章 8获赞 0访问量 197 关注 私信
相关文章推荐
- JDK源码学习(5)-Map的性能比较,HashMap和TreeMap,ConcurrentSkipListMap
- HashMap 源码学习
- java源码学习之HashMap(一)
- 学习JDK1.8集合源码之--HashMap
- JAVA源码学习-HashMap
- HashMap源码学习
- 哈希算法-----JAVA 源码中实现的HashMap学习总结
- JDK源码学习(6)-ConcurrentHashMap代码学习
- JDK源码学习笔记——HashMap
- HashMap源码学习
- 【jdk源码学习】HashMap
- java util包学习(9)HashMap源码分析
- JDK源码学习-HashMap\Hashtable
- Java集合ArrayList和HashMap源码学习
- 第014讲:Scala中Map和HashMap源码剖析及代码实践(从1000个代码案例中学习人工智能和大数据实战)
- java中HashMap源码学习分享
- Java集合源码学习(20)_Map接口的实现HashMap
- HashMap源码学习
- 【Java集合学习系列】HashMap实现原理及源码分析
- 史上最详尽 Java 8 集合类 HashMap : 底层实现和原理学习笔记(源码解析)