首页 > 编程知识 正文

hashtable底层实现原理(hashmap entrySet手记)

时间:2023-05-04 23:51:40 阅读:123463 作者:640

我以前看过hashmap的基本代码,主要是看他的代码结构、数据结构以及相关的get、put逻辑。 今天突然想到,到现在为止看源代码好像都没有看到entryset。 反复无常,重点看了。 结果、和hashmap真的没有对entryset的操作。

如何构建hashmap :

可见,hashmap构建方法只是初始化了默认的装载系数。

put方法:

finalvputval(inthash,K key,V value,boolean onlyIfAbsent,boolean evict ) { NodeK,V[] tab; NodeK,V p; int n,I; if () tab=table )==null||(n=tab.Length )=0) n=(tab=resize ) ).length; if () p=tab(I=(n-1 ) hash]] ) null (tab ) I )=new node (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,value ); else{for(intbincount=0; binCount () if ) (e=p.next ) null ) ) p.next=newnode ) hash,key,value,null ); if (bincount=tree ify _ threshold-1 )/-1for1STTreeifybin(tab,hash ); 布雷克; (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; 返回载荷值; } }模具计数; 大小阈值(if )大小); 自动识别(evict; 返回空值; }其中未看到对entryset的操作。 包括resize扩展、使用newNode创建新节点。

在中,为了清楚hashmap的entryset何时初始化以及何时添加元素,我们开始调试:

测试方法:

在初始化publicstaticvoidmain (string [ ] args )/mapentrysetHashmapstring时,String map=new HashMap ); String key01='key '; map.put(key01,' key01 '; stringv01=map.get(key01 ); SetMap.EntryString,String entries=map.entrySet (; map.toString (; system.out.println(V01; 让我们来看看照片:

首先进入put方法:

由于是第一次添加元素,因此map的table此时为空,可见需要初次resize。 此时的entryset还是空的;

但是,当代码进入resize方法的第一行时,entryset会不可思议地初始化,并显示长度为0

然后执行直到确定是否需要扩展。 此时,entryset保持为空,长度保持为0。 但后来却莫名其妙;

由于是第一次添加元素,因此put完成后未执行resize方法。 实际上,在执行sizethreshold的判断后,直接跳到了after方法。 但是奇怪的是,此时的entryset的长度竟然变成了1!

我去网上找资料了。 检测到调试模式时,隐式调用toString方法并初始化entry

好不容易解释了输入初始化的理由。 但是,没能说明是什么时候添加的元素。

我再研究一下。

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