/*删除节点*/
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;// 定义节点数组tab用于指向table、节点p、数组长度n、hash所映射的数组下标
if ((tab = table) != null && (n = tab.length) > 0 &&
(p = tab[index = (n - 1) & hash]) != null) {// 节点数组在hash位置处的节点不为空,若为空则直接返回null(不存在可删除元素)
Node<K,V> node = null, e; K k; V v;// 定义局部节点变量node存储需要删除的元素、循环变量e、key、value
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))// 头结点即为需要删除的节点
node = p;
else if ((e = p.next) != null) {// 链表还存在其他元素,并将e指向头结点的后继元
if (p instanceof TreeNode)// 该链表是一个红黑树结构
node = ((TreeNode<K,V>)p).getTreeNode(hash, key);// 在红黑树中查询指定hash、key的节点并返回
else {// 链表是一个单项链表
do {
if (e.hash == hash &&
((k = e.key) == key ||
(key != null && key.equals(k)))) {
node = e;// 节点e时需要移除的节点,结束循环
break;
}
p = e;// 循环结束时,节点p为目标节点的前驱元
} while ((e = e.next) != null);
}
}
if (node != null && (!matchValue || (v = node.value) == value ||
(value != null && value.equals(v)))) {// 存在需要移除的节点且值匹配删除为false或者不为false且值匹配
if (node instanceof TreeNode)// node为树形节点,使用treeNode的移除方法
((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);
else if (node == p)// 若node为头结点,直接将node 的后继元作为新的头结点
tab[index] = node.next;
else
p.next = node.next;// 链表下移除节点且不为头结点,此时将目标节点的前驱元的后继元指向目标节点的后继元
++modCount;
--size;
afterNodeRemoval(node);
return node;
}
}
return null;
}

JDK8 HashMap--removeNode()移除节点方法的更多相关文章

  1. JDK8 HashMap 源码解析

    HashMap中数据结构 在jdk1.7中,HashMap采用数组+链表(拉链法).因为数组是一组连续的内存空间,易查询,不易增删,而链表是不连续的内存空间,通过节点相互连接,易删除,不易查询.Has ...

  2. JS递归及二叉搜索树的移除节点

    1递归含义:在某时某刻某个条件下调用包含自己的函数 2:注意点:⑴递归过程中一定要加限制条件,要不然会陷入死循环: 死循环eg: function f(someP){ f(somP); } f(4); ...

  3. JS添加节点方法与JQuery添加节点方法的比较及总结

    原生JS添加节点方法与JQuery添加节点方法的比较及总结   一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div ...

  4. JDK8.0接口中的默认方法和静态方法

    我们在接口中通常定义的方法是抽象方法,即没有方法体,只有返回值类型和方法名:(public abstract) void Method(); 类在实现接口的时候必须重写抽象方法才可以 jdk8中新加的 ...

  5. dom4j移除节点不成功

    在使用dom4j的时候想移除xml节点,经常使用remove来移除节点,通过整个文档或者根节点删除某一个子节点,但如果子节点不是儿子节点,在dom4j中就无法删除.在dom4j中移除节点必须使用父节点 ...

  6. HashMap的四种遍历方法,及效率比较(简单明了)

    https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, Str ...

  7. 使用 kubectl drain 从集群中移除节点

    对节点执行维护操作之前(例如:内核升级,硬件维护等),您可以使用 kubectl drain 安全驱逐节点上面所有的 pod.安全驱逐的方式将会允许 pod 里面的容器遵循指定的 PodDisrupt ...

  8. Hadoop中正确地添加和移除节点

    正确地添加和移除节点 添加节点 克隆 克隆一台全新的Linux(如有IP冲突,可右击VMware右下角网络图标断开连接) 打开/etc/hostname修改主机名 打开/etc/sysconfig/n ...

  9. jdk8 HashMap tableSizeFor

    今天读jdk8  HashMap源码,构造函数中 根据initialCapacity初始化threshold public HashMap(int initialCapacity, float loa ...

随机推荐

  1. Python3-Cookbook总结 - 第一章:数据结构和算法

    第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. ...

  2. 【软件工程】分布式版本控制系统Git的安装与使用

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远端库地址:https://github.com/Richa ...

  3. 提升webpack打包速度

    webpack打包文件体积过大,怎么提升速度? 借助webpack visualizer可视化插件,来看构建的情况.这个问题要具体情况具体分析,看看打包文件有哪些块头比较大,哪些不常改变,最好列一个l ...

  4. line-height:1.5和line-height:150%的区别

    1. 给你个数,孩子自己算吧  line-height:1.5 父元素设置line-height:1.5会直接继承给子元素,子元素根据自己的font-size再去计算子元素自己的line-height ...

  5. Mysql概念及基本操作

    1.Mysql 概念 1.1 定义 数据库本质是一个C/S的套接字软件 关系型数据库:MySQL mariadb db2 非关系型:存取数据是以key:Value mongodb redis 1.2 ...

  6. ECMA Script 6_字符串_扩展_字符 是4字节还是2字节?_模板字符串

    ES6 字符串扩展 ES6 加强了对 Unicode 的支持,并且扩展了字符串对象 字符 的 Unicode 表示法 允许采用 \uxxxx 形式表示一个字符, 其中 xxxx 表示字符的 Unico ...

  7. nodejs----安装配置

    Node.js 安装配置 Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/. 你可以根据不同平台系统选择你需要的 Node.js 安装包. Nod ...

  8. Appium-Python-Windows环境搭建笔记

    Appium版本:1.11.0 操作系统:Windows7-64位 开发语言:Python 3.7.2 测试应用平台:安卓 5.1.1 Appium服务端 一.JDK 也许你会觉得很奇怪,我搭建Pyt ...

  9. zhuan: WAN simulating tool - Netem : command tc qdisc

    Last weekly meeting we talked about a WAN simulating tool in order to test WPG, I find a great tool ...

  10. set和 map 数据结构

    set/map数据结构 创建: var  s=new Set(); 添加成员 s.add(1) 遍历 for of s.froEach 删除 s.delete() 判断存在 s.has() 清除 s. ...