首页 > 编程知识 正文

hashset底层数据结构,HashMap和Hashtable的区别

时间:2023-05-06 12:51:07 阅读:15481 作者:3960

HashMap的低层其实是数组结构,序列的各项是链表或者红黑树

存储结构为数组+链表+红黑树

1 .计算密钥的混列值。 计算方式是(key==null )? 0:(h=key.hashcode () ) ) ) ) ) ) ) );

2 .检查当前数组是否为空。 如果为空,则必须初始化。 初始化容量为16,负载因子默认为0.75

3 .计算数组中key的坐标。 计算方式:(容量- 1) hash .容量始终为2的平方,因此值为- 1的二进制总是全1。 与hash值的运算很容易。

1 )如果计算出的坐标元素为空,则创建节点并加入,结束put。

I )如果当前数组的容量大于负载因子设置的容量,请访问进行扩容

2 )计算出的坐标要素有值时。

I )如果next节点不为空(存在key ),则循环查看next节点。 如果发现next节点所在的key与参与的key相同,则相应的值将替换为新值。

ii ) next节点为空时(key不存在) )

1 .是treeNode。 将要添加的值和key添加到next节点。

不是趋势科技:

I )如果循环next节点的超过8层还不为空,则将此位置元素转换为红黑树,并插入键值对

ii )如果坐标上的要素值和加上的值key完全相同,则覆盖原值。

调用publicvput(kkey,V value ) putVal )方法执行returnputval ) hash(key )、key、value、false、true ); }finalvputval(inthash,K key,V value,boolean onlyIfAbsent,boolean evict ) { NodeK,V[] tab; NodeK,V p; int n,I; 判断是否初始化table。 否则,初始化操作if((tab=table )==null|| (n=tab.length )=0) n=(tab=resize ) ) ).length; //计算保存的索引位置,如果没有元素则直接使用if(p=tab(I=(n-1 ) hash]] ) null (tab ) I )=newnode ) hash、key、value、null else { NodeK,V e; k; 如果//节点已经存在,则赋值操作if(p.hash==hash ) () k=p.key )==key||(key!=nullkey.equals(k ) ) (e=p; //链表为红黑树elseif(pinstanceoftreenode )//红黑树对象操作e=((treenodek,v ) p ).puttreeval ) this、tab、hash、key ; binCount () if ) (e=p.next ) null ) ) p.next=newnode ) hash,key,value,null ); //将链表长度设置为8,将链表设置为红黑树存储if (bincount=tree ify _ threshold-1 )//-1for1STTreeifybin(tab,hash ) 布雷克; } //key存在,直接覆盖if (e.hash==hash ) ) k=e.key )==key||(key!=nullkey.equals(k ) ) (break; p=e; }if(e!=null (//existingmappingforkeyvoldvalue=e.value; if (! olyifabsent|||old value==null (e.value=value; afternodeaccess(e; 返回载荷值; //记录修正次数modCount; //扩展if (大小阈值) resize ); //空操作afternodeinsertion(evict ); 返回空值; }

HashMap中的红黑树:

当链表的节点达到8个时,链表将转换为红黑树,但少于6个时将返回链表

因为如果节点太多,使用红黑树(二叉树)可以更有效地找到节点

问:为什么迁移条件是8和6,有差别?

如果没有差异,经常插入和删除元素,且链表的数量正好为8,则重复链表的转速,计算链表的数量

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