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里的人才還是厲害啊,你看都看不明白,人家就能設計出來,實現出來 。真的是你我皆為螻蟻 , 只不過是一個個搬磚工具人呀 。哈哈,對自己的一個自嘲哈,共勉?。】吹秸飫锪? ,點個贊吧,小編碼字實屬不易呀??!谢袦o耍 。?
環境大家關注小編的微信公眾號!謝謝大家!

HashMap底層原理及jdk1.8源碼解讀

文章插圖
推廣自己網站時間到了?。。?
點擊訪問!歡迎訪問,里面也是有很多好的文章哦!
【HashMap底層原理及jdk1.8源碼解讀】

推薦閱讀