前面增加和查詢都解析完了,這裡我們看一下跟刪除相關的方法。
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掉乙個...