首页 > 编程知识 正文

自己实现hashmap,hashmap底层实现原理红黑树

时间:2023-05-05 11:25:56 阅读:129423 作者:2092

HashMap:(1)从JDK1.8开始,hashmap的数据结构从向简单数组添加链表的结构更改为数组链表的红黑树。

)2) Node是HashMap的内部类,实现Map.Entry接口。 本质是KV映射,每个元素都是Node对象。 正如名字所示,混洗映射被保存在混洗表中。 为了解决散列冲突问题,Java采用这种数组链表方式进行存储。

)3) HashMap在JDK1.8中采用,由数组链表的红黑树构成。 如果根据key索引((n - 1 ) hash )确定节点的位置,并且同一节点中的数据不是一个)的数量大于树阈值(TREEIFY_THRESHOLD ) 8,则节点中的存储结构为红黑树

TreeNode链表修改红黑树: finalvoidtreeify(nodek,V[] tab ) ) /树TreeNodeK,V root=null; for(treenodek,V x=this,next; x!=null; x=next () next=(treenodek,v ) x.next; //记录x.next,使得下一个x=x.next遍历//x为当前插入到树中的数据x.left=x.right=null; if(root==null(//根节点x.parent=null; x.red=false; 根=x; } else { K k=x.key; //当前要插入的树节点的key int h=x.hash; //当前节点的混列类? kc=null; for(treenodek,V p=root; (//从根节点遍历p。 p与x比较,找出x插入树的哪个位置int dir,//dir :方向ph :当前比较的p的hashcode K pk=p.key; if () ph=p.hash ) h )/p的hash值大于x的hash值时,dir为-1 dir=-1; 当elseif(ph )//p的散列值小于x的散列值时,dir为1 dir=1; 如果ELSEif((KC==null//p和x的混列值相同,没有可比较的) kc=comparableClassFor(k ) k ) )==null(|/comparable接口为如果k和pk的classname相同,则调用比较k和pk的原始hashcode。 TreeNodeK,V xp=p; if () p=) dir=0)? p.left:p.right(=null ) ) { x.parent=xp; if(dir=0) xp.left=x; else xp.right=x; //保持红黑树插入数据,root=balanceinsertion(root,x ); 布雷克; }//ensuresthatthegivenrootisthefirstnodeofitsbin.moveroottofront (tab,root ); }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。