HashSet的remove办法经过HashMap的remove办法来完成
//HashSet的remove办法
publicbooleanremove(Objecto){
returnmap.remove(o)==PRESENT;
}
//map的remove办法
publicVremove(Objectkey){
Node<K,V>e;
//经过hash(key)找到元素在数组中的位置,再调用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所对应Node的精确位置,首先经过(n-1)&hash找到数组对应位置上的第一个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假如这个node刚好key值相同,运气好,找到了
if(p.hash==hash&&
((k=p.key)==key||(key!=null&&key.equals(k))))
node=p;
/**
*1.2运气不好,在数组中找到的Node固然hash相同了,但key值不同,很明显不对,我们需求遍历继续
*往下找;
*/
elseif((e=p.next)!=null){
//1.2.1假如是TreeNode类型,阐明HashMap当前是经过数组+红黑树来完成存储的,遍历红黑树找到对应node
if(pinstanceofTreeNode)
node=((TreeNode<K,V>)p).getTreeNode(hash,key);
else{
//1.2.2假如是链表,遍历链表找到对应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);
}
}
//经过前面的步骤1找到了对应的Node,如今我们就需求删除它了
if(node!=null&&(!matchValue||(v=node.value)==value||
(value!=null&&value.equals(v)))){
/**
*假如是TreeNode类型,删除办法是经过红黑树节点删除完成的,详细能够参考【TreeMap原理完成
*及常用办法】
*/
if(nodeinstanceofTreeNode)
((TreeNode<K,V>)node).removeTreeNode(this,tab,movable);
/**
*假如是链表的状况,当找到的节点就是数组hash位置的第一个元素,那么该元素删除后,直接将数组
*第一个位置的援用指向链表的下一个即可
*/
elseif(node==p)
tab[index]=node.next;
/**
*假如找到的原本就是链表上的节点,也简单,将待删除节点的上一个节点的next指向待删除节点的
*next,隔分开待删除节点即可
*/
else
p.next=node.next;
++modCount;
–size;
//删除后可能存在存储构造的调整,可参考【LinkedHashMap如何保证次第性】中remove办法
afterNodeRemoval(node);
returnnode;
}
}
returnnull;
}
广州天河区珠江新城富力盈力大厦北塔2706
020-38013166(网站咨询专线)
400-001-5281 (售后服务热线)
品牌服务专线:400-001-5281
长沙市天心区芙蓉中路三段398号新时空大厦5楼
联系电话/ (+86 0731)88282200
品牌服务专线/ 400-966-8830
旗下运营网站:
Copyright © 2016 广州思洋文化传播有限公司,保留所有权利。 粤ICP备09033321号