HashMap底层原理及jdk1.8源码解读( 四 )

6、remove方法解读/** * 如果key存在,就把元素删除 */public V remove(Object key) {Node<K,V> e;return (e = removeNode(hash(key), key, null, false, true)) == null ?null : e.value;}/** * 删除方法的具体实现* @param hash经过hash运算后的key* @param key你要移除的key* @param value你要移除的value * @param matchValue如果为真 , 则仅在值相等时删除,我们为FALSE,key相同即删除 * @param movable如果为假,则在删除时不要移动其他节点,我们为TRUE , 删除移动其他节点 */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;// 判断table不为空,链表不为空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;// 数组中的第一个节点就是我们要删除的节点if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))// 要删除的节点给nodenode = p;// 第一个不是,并且后面还有节点else if ((e = p.next) != null) {// 如果是红黑树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)))) {// 找到要删除的nodenode = e;break;}p = e;} while ((e = e.next) != null);}}// 这里说明我们要删除的节点已找到if (node != null && (!matchValue || (v = node.value) == value ||(value != null && value.equals(v)))) {// 如果为红黑树,就按红黑树进行删除if (node instanceof TreeNode)((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);//我们要删除的是头节点else if (node == p)tab[index] = node.next;// 由于删除的是首节点,那么直接将节点数组对应位置指向到第二个节点即可//不是头节点,将当前节点指向删除节点的下一个节点elsep.next = node.next;// p的下一个节点指向到node的下一个节点即可把node从链表中删除了// 操作+1++modCount;// map大小-1--size;// 空的实现afterNodeRemoval(node);// 返回删除的节点return node;}}return null;}六、总结Has和Map得底层还是很多的 , 里面用的一些逻辑和算法,都是很牛皮的、耐人琢磨的 。oracle里的人才还是厉害啊,你看都看不明白,人家就能设计出来,实现出来 。真的是你我皆为蝼蚁 , 只不过是一个个搬砖工具人呀 。哈哈,对自己的一个自嘲哈,共勉?。】吹秸饫锪? ,点个赞吧,小编码字实属不易呀?。⌒恍涣耍 。?
环境大家关注小编的微信公众号!谢谢大家!

HashMap底层原理及jdk1.8源码解读

文章插图
推广自己网站时间到了?。。?
点击访问!欢迎访问,里面也是有很多好的文章哦!
【HashMap底层原理及jdk1.8源码解读】

推荐阅读