志在指尖
用双手敲打未来

remove方法

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值不同,很明显不对,我们需求遍历继续java
*往下找;
*/
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;
}

未经允许不得转载:IT技术网站 » remove方法
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载