HashSet的remove辦法經(jīng)過HashMap的remove辦法來完成
//HashSet的remove辦法
publicbooleanremove(Objecto){
returnmap.remove(o)==PRESENT;
}
//map的remove辦法
publicVremove(Objectkey){
Node<K,V>e;
//經(jīng)過hash(key)找到元素在數(shù)組中的位置,再調(diào)用removeNode辦法刪除
return(e=removeNode(hash(key),key,null,false,true))==null?null:e.value;
}
/**
*
*/
finalNode<K,V>removeNode(inthash,Objectkey,Objectvalue,
booleanmatchValue,booleanmovable){
Node<K,V>[]tab;Node<K,V>p;intn,index;
//步驟1.需求先找到key所對(duì)應(yīng)Node的精確位置,首先經(jīng)過(n-1)&hash找到數(shù)組對(duì)應(yīng)位置上的第一個(gè)node
if((tab=table)!=null&&(n=tab.length)>0&&
(p=tab[index=(n-1)&hash])!=null){
Node<K,V>node=null,e;Kk;Vv;
//1.1假如這個(gè)node剛好key值相同,運(yùn)氣好,找到了
if(p.hash==hash&&
((k=p.key)==key||(key!=null&&key.equals(k))))
node=p;
/**
*1.2運(yùn)氣不好,在數(shù)組中找到的Node固然hash相同了,但key值不同,很明顯不對(duì),我們需求遍歷繼續(xù)
*往下找;
*/
elseif((e=p.next)!=null){
//1.2.1假如是TreeNode類型,闡明HashMap當(dāng)前是經(jīng)過數(shù)組+紅黑樹來完成存儲(chǔ)的,遍歷紅黑樹找到對(duì)應(yīng)node
if(pinstanceofTreeNode)
node=((TreeNode<K,V>)p).getTreeNode(hash,key);
else{
//1.2.2假如是鏈表,遍歷鏈表找到對(duì)應(yīng)node
do{
if(e.hash==hash&&
((k=e.key)==key||
(key!=null&&key.equals(k)))){
node=e;
break;
}
p=e;
}while((e=e.next)!=null);
}
}
//經(jīng)過前面的步驟1找到了對(duì)應(yīng)的Node,如今我們就需求刪除它了
if(node!=null&&(!matchValue||(v=node.value)==value||
(value!=null&&value.equals(v)))){
/**
*假如是TreeNode類型,刪除辦法是經(jīng)過紅黑樹節(jié)點(diǎn)刪除完成的,詳細(xì)能夠參考【TreeMap原理完成
*及常用辦法】
*/
if(nodeinstanceofTreeNode)
((TreeNode<K,V>)node).removeTreeNode(this,tab,movable);
/**
*假如是鏈表的狀況,當(dāng)找到的節(jié)點(diǎn)就是數(shù)組hash位置的第一個(gè)元素,那么該元素刪除后,直接將數(shù)組
*第一個(gè)位置的援用指向鏈表的下一個(gè)即可
*/
elseif(node==p)
tab[index]=node.next;
/**
*假如找到的原本就是鏈表上的節(jié)點(diǎn),也簡單,將待刪除節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)的next指向待刪除節(jié)點(diǎn)的
*next,隔分開待刪除節(jié)點(diǎn)即可
*/
else
p.next=node.next;
++modCount;
–size;
//刪除后可能存在存儲(chǔ)構(gòu)造的調(diào)整,可參考【LinkedHashMap如何保證次第性】中remove辦法
afterNodeRemoval(node);
returnnode;
}
}
returnnull;
}
廣州天河區(qū)珠江新城富力盈力大廈北塔2706
020-38013166(網(wǎng)站咨詢專線)
400-001-5281 (售后服務(wù)熱線)
深圳市坂田十二橡樹莊園F1-7棟
Site/ http://www.szciya.com
E-mail/ itciya@vip.163.com
品牌服務(wù)專線:400-001-5281
長沙市天心區(qū)芙蓉中路三段398號(hào)新時(shí)空大廈5樓
聯(lián)系電話/ (+86 0731)88282200
品牌服務(wù)專線/ 400-966-8830
旗下運(yùn)營網(wǎng)站:
Copyright ? 2016 廣州思洋文化傳播有限公司,保留所有權(quán)利。 粵ICP備09033321號(hào)