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;
}
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com