IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> HashMap (jdk1.8) remove(Object key)方法详细注释 -> 正文阅读

[数据结构与算法]HashMap (jdk1.8) remove(Object key)方法详细注释

remove(Object key)功能:删除指定的key对应的元素。

/*
    * 删除节点
    * Object key:需要删除的key
    * */
    public V remove(Object key) {
        HashMap.Node<K,V> e;   //定义Node类型的节点e
        /*
        * 调用removeNode(hash(key), key, null, false, true),把执行结果赋值给e,如果e为空,则返回null,否则返回要删除的key对应的value
        * */
        return (e = removeNode(hash(key), key, null, false, true)) == null ?
                null : e.value;
    }

remove方法中直接调用了removeNode(hash(key), key, null, false, true),所以本文重点注释了removeNode方法。

 final HashMap.Node<K,V> removeNode(int hash, Object key, Object value,
                                       boolean matchValue, boolean movable) {
        /*
        * 定义Node类型的数组tab,node类型的节点p,定义tab的长度n,tab下标index
        * */
        HashMap.Node<K,V>[] tab; HashMap.Node<K,V> p; int n, index;
        if ((tab = table) != null && (n = tab.length) > 0 && //把hashMap成员变量table赋值给tab,且tab不为空,长度大于0
                (p = tab[index = (n - 1) & hash]) != null) { //通过给定的hash值计算key在数组tab中的位置index,如果tab[index]不为空,如果这个位置已经有元素存储了,p:存放当前节点
            HashMap.Node<K,V> node = null, e; K k; V v; //定义Node节点node,用户存放将要删除的节点,e:用于存放链表上的节点,定义中间变量k,v
            if (p.hash == hash &&     //如果当前节点的hash值等于给定的hash,且当前节点的ke等于给定的key
                    ((k = p.key) == key || (key != null && key.equals(k))))
                node = p; //把当节点p赋值给node;
            else if ((e = p.next) != null) { //如果p的下一个节点不为空,说明该位置有链表或红黑树,把p志向的下一个节点赋值给e
                if (p instanceof HashMap.TreeNode)   //如果当前节点是红黑树
                    node = ((HashMap.TreeNode<K,V>)p).getTreeNode(hash, key); //走红黑树的删除节点的分支
                else {   //如果当前节点是链表,通过while循环找到链表中和给定的hash和key一样的节点(待删除节点),赋值给node
                    do {
                        if (e.hash == hash &&
                                ((k = e.key) == key ||
                                        (key != null && key.equals(k)))) { //如果链表上的节点e的hash等于给定的hash,e的key等于给定的key,代表找到了要删除的节点e,赋值给node
                            node = e;
                            break; //退出while
                        }
                        p = e; //如果e的hash、key不等于给定的hash,key,链表往下循环
                    } while ((e = e.next) != null);//退出循环条件,为啥是e = e.next?
                }
            }
            if (node != null && (!matchValue || (v = node.value) == value ||
                    (value != null && value.equals(v)))) { //如果node不为空,不需要匹配value,node的value和给定的value相同
                if (node instanceof HashMap.TreeNode) //node是红黑树
                    ((HashMap.TreeNode<K,V>)node).removeTreeNode(this, tab, movable); //走红黑树分支删除node
                else if (node == p) //node是数组
                    tab[index] = node.next; //删除node
                else
                    p.next = node.next; //node在链表上,删除链表上的node
                ++modCount; //记录hashMap被修改的次数
                --size;//hashMap长度减一
                afterNodeRemoval(node);//回掉函数
                return node; //返回被删除的节点
            }
        }
        return null;//返回
    }

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:11:55  更:2021-07-14 23:14:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:39:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计