HashMap的remove相關方法

2021-10-05 18:33:15 字數 2498 閱讀 8159

前面增加和查詢都解析完了,這裡我們看一下跟刪除相關的方法。

public v remove

(object key)

通過原始碼可以看到,主要的功能方法還是裡面的removenode方法,我們看一下removenode方法:

final node

removenode

(int hash, object key, object value,

boolean matchvalue,

boolean movable)

p = e;

}while

((e = e.next)

!= null);}

}if(node != null &&

(!matchvalue ||

(v = node.value)

== value ||

(value != null && value.

equals

(v))))

}return null;

}

這裡是remove方法的原始碼,雖然注釋也寫了很多,但是我們還是一步一步來分析一遍。

if

((tab = table)

!= null &&

(n = tab.length)

>0&&

(p = tab[index =

(n -1)

& hash]

)!= null)

繼續:

其實我們會發現,查詢和刪除都有相同的一步,就是需要先把這個key指定的節點找出來。再去執行後面的操作。所以我們可以看到,removenode前面一部分**和查詢的**是相似的。

node

node = null, e; k k; v v;

if(p.hash == hash &&

((k = p.key)

== key ||

(key != null && key.

equals

(k))))

//(hash值相等) 並且 (key位址等或key equals為true)

//如果條件都成立,表示table[(n-1)&hash]上的元素就是需要找的元素

node = p;

elseif(

(e = p.next)

!= null)

p = e;

}while

((e = e.next)

!= null);}

}

同樣情景也是分為三種:

具體細節就不再贅述,跟前面get方法一直。

繼續:

if

(node != null &&

(!matchvalue ||

(v = node.value)

== value ||

(value != null && value.

equals

(v))))

執行完查詢之後就是需要執行具體的刪除操作了。

首先需要判斷指定的節點是否存在

我們再回過頭來看這個remove方法的宣告:

public v remove

(object key)

只傳入乙個key,來刪除,即不用通過比較value的值,遇到相同的key就刪除,所以在呼叫removenode的時候,matchvalue引數傳入的是false,即這個值為false,!matchvalue就為true,則後面的值value就不用比較了。

if

(node != null &&

(!matchvalue ||

(v = node.value)

== value ||

(value != null && value.

equals

(v))

))

我們再看一下傳入兩個值的方法

public

boolean

remove

(object key, object value)

通過前面的分析,我們大概可以猜到,這個方法移除條件是建立在key和value都相同的時候,才移除節點。所以matchvalue傳入的是true。此時的!matchvalue就是false,所以需要看後面value判斷是否為true。

if

(node != null &&

(!matchvalue ||

(v = node.value)

== value ||

(value != null && value.

equals

(v))

))

至此,hashmap的remove方法就解析這麼多了

深入理解HashMap(五)remove方法解析

remove作為核心方法之一,也是我們需要掌握的重點,來看一下remove方法 可以看出,remove方法中呼叫了removenode方法,進去removenode方法 final node removenode int hash,object key,object value,boolean ma...

STL中的remove問題

我將從remove的複習開始這個條款,因為remove是stl中最糊塗的演算法。誤解remove很容易,驅散所有關於remove行為的疑慮 為什麼它這麼做,它是怎麼做的 是很重要的。這是remove的宣告 templateforwarditerator remove forwarditerator ...

關於java List的remove方法

今天在做乙個專案的時候,遇到list 中的remove方法。由於有雙重巢狀迴圈,大概是這樣的 最後發現結果不正確,怎麼回事呢?第一反應把listinfo.remove info 注釋掉,發現現在結果對啦,那為什麼會出現這樣的錯誤呢?google搜尋,有位同事說的對,原因 list每remove掉乙個...