应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

HashMap详解

  讲解步骤基础知识工作原理关键代码核心方法基础知识
  数组结构数组接口,在查询数据方面,具备优势
  链表结构链表结构,在增删数据方面,具备优势
  红黑树结构红黑树结构,在查询数据方面,数据量较大的时候,具备一定的优势
  什么是散列(哈希)表散列表,顾名思义,就是将数据分布在不同的列但是散列表并不是完全将数据分散在不同的列,而是按照某种规则,将具备同样规则的数据存储在同一列。即具备相同规则的数据存储在同一列,规则不同的数据分布在不同的列。这种规则最终的产生与哈希值有关。这里需要注意的事,哈希值只是确定最后存储列的因素,也就是说不同的哈希值可能会存在同一列。
  什么是哈希值哈希值简单的说,就是hashCode方法产生的值。默认的hashCode方法是由其地址值最终产生一个哈希值。由于HashMap中的元素是否存储是由键来决定,所以如果自定义的类需要存储在键,且想遵循自己的存储规则,需要重写HashCode方法又因为Map集合的键是不能重复的,所以需要重写equals方法,定义去重规则。工作原理存储结构
  HashMap基于散列法,又称哈希法:数组链表红黑树。HashMap需要同时存储一对键和值。Map集合中提供了put(key,value)方法,所有的键和值会被封装到一个Entry实现类(Node)对象,存储到集合中。在存储的过程中,会先通过hashCode()方法获取一个哈希值,并通过这个哈希值,与数组的长度进行一定的运算,得到一个索引值(存储的列)在通过equals方法来判断这个元素是否已存在,不存在则存储在该列,若存储,则保留原来的数据。存储在一列的数据,将以链表的形式,前后关联,这样有利于将来进行删除的时候提高效率。但是如果一列的桶结构数据过多,就会导致查询的效率降低。为了优化桶结构带来的问题,HashMap中会去检查,当一列的桶结构数据达到8个以上,就降这一列树化(转变为树结构)名词理解所有的数据都是以Node节点为单位。hash值:哈希值,该方法内部提供了一个扰动函数inthashCode()扰动函数:用于产生哈希值,前16位与后16位做异或运算,提高低位随机性。hkey。hashCode())(h16)路由寻址:由数组长度与哈希值产进行与操作,产生最终的存储列(索引位置):(table。length1)node。hashHash碰撞:哈希值如果相同,就会存储到相同的列。链化:哈希值相同,就会存储在同系列,产生桶状结构,桶结构过长,查询数据低效。红黑树:jdk8引入,类似于二叉树,可以避免过长的桶状结构扩容原理扩容:增加数组长度。目的在于解决数据过多,链化严重,默认以两倍的长度扩容。一列添加第8个元素,且数组长度小于64,会优先扩容。一列添加第8个元素,且数组长度达到64个,会优先树化。添加元素后,若哈希表中元素总个数超过阈值(一个指定的值),会进行扩容。扩容后,会重新根据数组长度和哈希值计算存储位置。关键代码核心字段staticfinalintDEFAULTINITIALCAPACITY14;默认数组大小staticfinalintMAXIMUMCAPACITY130;数组最大长度staticfinalfloatDEFAULTLOADFACTOR0。75f;默认负载因子staticfinalintTREEIFYTHRESHOLD8;树化阈值staticfinalintUNTREEIFYTHRESHOLD6;树降级阈值staticfinalintMINTREEIFYCAPACITY64;树化阈值transientNodeK,V〔〕table;哈希表transientSetMap。EntryK,VentrySet;键值对对象集合transientintsize;元素长度transientintmodCount;增删元素次数intthreshold;扩容阈值扩容阈值loadFactorcapacityfinalfloatloadFactor;负载因子核心方法
  putputVal(存储数据)finalVputVal(inthash,Kkey,Vvalue,booleanonlyIfAbsent,booleanevict){NodeK,V〔〕tab;NodeK,Vp;intn,i;判断表是否为空或长度为0,若满足条件,则初始化表(体现了延迟加载)if((tabtable)null(ntab。length)0)n(tabresize())。length;判断要添加的元素对应的列是否为空,若满足条件,则直接插入if((ptab〔i(n1)hash〕)null)tab〔i〕newNode(hash,key,value,null);else{NodeK,Ve;Kk;判断元素的哈希值与要存储列的键相同,则替换键对应的值if(p。hashhash((kp。key)key(key!nullkey。equals(k))))ep;elseif(pinstanceofTreeNode)如果当前节点是一个数结构节点,按照树结构存储新元素。e((TreeNodeK,V)p)。putTreeVal(this,tab,hash,key,value);else{for(intbinCount0;;binCount){遍历当前列的节点,判断如果当前节点超过8个节点,则将当前列转为树结构。if((ep。next)null){p。nextnewNode(hash,key,value,null);if(binCountTREEIFYTHRESHOLD1)1for1sttreeifyBin(tab,hash);break;}if(e。hashhash((ke。key)key(key!nullkey。equals(k))))break;pe;}}存在相同键,就值替换新值if(e!null){existingmappingforkeyVoldValuee。value;if(!onlyIfAbsentoldValuenull)e。valuevalue;afterNodeAccess(e);returnoldValue;}}记录操作次数modCount;判断元素个数达到指定的阈值,则进行扩容操作。if(sizethreshold)resize();afterNodeInsertion(evict);returnnull;}
  resize(扩容)finalNodeK,V〔〕resize(){NodeK,V〔〕oldTabtable;intoldCap(oldTabnull)?0:oldTab。length;intoldThrthreshold;intnewCap,newThr0;if(oldCap0){if(oldCapMAXIMUMCAPACITY){thresholdInteger。MAXVALUE;returnoldTab;}elseif((newCapoldCap1)MAXIMUMCAPACITYoldCapDEFAULTINITIALCAPACITY)修改新表的长度为旧表的两倍newThroldThr1;doublethreshold}elseif(oldThr0)initialcapacitywasplacedinthresholdnewCapoldThr;else{zeroinitialthresholdsignifiesusingdefaultsnewCapDEFAULTINITIALCAPACITY;newThr(int)(DEFAULTLOADFACTORDEFAULTINITIALCAPACITY);}if(newThr0){floatft(float)newCaploadFactor;newThr(newCapMAXIMUMCAPACITYft(float)MAXIMUMCAPACITY?(int)ft:Integer。MAXVALUE);}thresholdnewThr;SuppressWarnings({rawtypes,unchecked})NodeK,V〔〕newTab(NodeK,V〔〕)newNode〔newCap〕;tablenewTab;将新表内容,重新计算位置后,放入新表if(oldTab!null){for(intj0;joldCap;j){NodeK,Ve;if((eoldTab〔j〕)!null){oldTab〔j〕null;if(e。nextnull)newTab〔e。hash(newCap1)〕e;elseif(einstanceofTreeNode)((TreeNodeK,V)e)。split(this,newTab,j,oldCap);else{preserveorderNodeK,VloHeadnull,loTailnull;NodeK,VhiHeadnull,hiTailnull;NodeK,Vnext;do{nexte。next;if((e。hasholdCap)0){if(loTailnull)loHeade;elseloTail。nexte;loTaile;}else{if(hiTailnull)hiHeade;elsehiTail。nexte;hiTaile;}}while((enext)!null);if(loTail!null){loTail。nextnull;newTab〔j〕loHead;}if(hiTail!null){hiTail。nextnull;newTab〔joldCap〕hiHead;}}}}}returnnewTab;}
  tableSizeFor(数组长度初始化)二进制位运算右移:二进制数据向右移动一位,最高位补原最高位值,原最低位舍弃。41结果等于221结果等于1无符号右移:二进制数据向右移动一位,最高位补0,原最低位舍弃。41结果等于221结果等于1无符号右移动,会确保移动后一定是一个正数。左移:二进制数据向左移动一位,最低位补0,原最高位舍弃。举例:41结果等于881结果等于16或:有1则11001100结果为1100(12)staticfinalinttableSizeFor(intcap){下列操作的最终目的保证了,最终的n值一定比cap大,且最接近满足1后数组长度定义的数值(0,3,7,15,31,63。。。)1001100intncap1;nn1;nn2;nn4;nn8;nn16;return(n0)?1:(nMAXIMUMCAPACITY)?MAXIMUMCAPACITY:n1;}

真相艾力达双效片靠谱吗?为什么那么多人推荐?每次跟朋友聊起这个国家,大家总会对的风土人情、饮食文化非常关注,觉得很让人震惊。但其实,大家往往都忽略了一件事情,那就是在制药这方面更值得关注,更让人震惊。你见过哪个国家支持仿……球员顶薪从500万降到300万,为什么还有人认为太高了?如今的体育项目,你们要问哪支球队收入虚高,而且能力与收入不成正比,那肯定是中国男足,他们与亚洲强队相比,就是幼儿园水平,可是他们却拿着教授级别的收入,这样反差,当然国人十分不满……莱仕汉堡加盟费多少钱总部每日前十名咨询来电者可免费获得10000元创业扶持基金莱仕汉堡加盟费多少钱【总部】行业优势突出,很多人就在此抓住莱仕汉堡这个被很多人重视的商机,成为别人一辈子奋斗的榜样。……维莱克汉堡加盟费多少钱总部每日前十名咨询来电者可免费获得10000元创业扶持基金维莱克汉堡加盟费多少钱【总部】行业优势突出,很多人就在此抓住维莱克汉堡这个被很多人重视的商机,成为别人一辈子奋斗的榜……中药预防结直肠腺瘤术后复发结直肠腺瘤术后复发是很常见的疾病。在中医上认为结直肠腺瘤息肉术后复发属于本虚标实之证,其病机关键在于脾虚为根本,夹有痰、湿、瘀等病理产物。病因多由于先天禀赋不足,或后天饮食失节……申根签证的作用有哪些,如何申请申根签证?进入主题之前,我们先来了解一下申根国家,申根公约的成员国亦称申根国家或者申根公约国,成员国的整体又称申根区。申根公约目的是取消相互之间的边境检查点,并协调对申根区之外的边……无聊炸鸡汉堡加盟费用多少钱总部无聊炸鸡汉堡加盟无聊炸鸡汉堡在配料方面,选用健康的食材制作美食,对旗下店面,实施佐料食材配方的一致出产和配送。对加盟商,都会进行体系训练,得到品牌要求水平。无聊炸鸡汉堡用标准打……用经济学的思维方式,解决人类最基本的欲望,资源配置是市场经济经济学要解决的问题,是人类最基本、最重大的问题,也就是:人类怎样才能更快乐,更幸福!欲望的最显著特征是无穷大,也就是平常我们所说的欲壑难填。人的欲望没有止境,除非生命结束……狂轰501417!东契奇双探花爆发,勇士别大意,基德力挺状元北京时间4月7日,NBA常规赛继续进行,达拉斯独行侠队前往客场挑战底特律活塞队。独行侠队近期状态不俗,凭借着5战4胜的强势表现,独行侠队冲到了西部第4的位置;活塞队在重建中又一……五百客炸鸡汉堡加盟费多少钱总部现在汉堡是很多人生活中不可缺少的美食,在其中五百客炸鸡汉堡这是一个很有发展潜力的品牌,五百客炸鸡汉堡不管是技术还是产品的品质都已经很成熟,产品种类多样化让人百吃不厌,五百客炸鸡……密客传家宝上线,5把新武器泄露,双枪原来是重生自己搞出来的Apex官方发布消息,3月29日将发布勇士收集活动;密客传家宝上线。控制模式回归控制勇士收集活动物品皮肤展示勇士系列活动推出了一整套共计24种主题限时物……早春00后穿衣搭配哈喽今天是紫色系春装搭配,看到今年的流行色,可能有些女孩子呢,不太敢对紫色系入手,今天我会从三个角度给大家去分享一下,怎么去选择一个紫色的入门级的单品,那么就开始把第一套是入门……
前中超外援又要转会!叛逃事件仍令人不满,儿文梦还能否实现时间进入冬季,国际足球的冬季转会期也渐渐临近,许多球员开始谋划转会的事宜。在很多传闻转会的球员中,比利时国脚维特塞尔的名字引起了中国球迷的注意。这样的情况并不算罕见,因为在近两……40岁以后,请重视这3条养生准则!比运动喝水更重要常言道:三十而立,四十不惑,五十而知天命。年龄越大,尤其是到四十岁以后的年纪,健康就成为我们人生中的头等大事。一个人的身体健康是1,而财富、感情、事业、家庭都是1后面的0……新中国最伟大的十对夫妻当时他们不仅受万人敬仰,更是中国脊梁1949年10月1日,新中国正式成立,举国上下欢庆一堂!当时有这么十对夫妻,他们经历了抗日战争,解放战争,以及数十年的苦难磨砺,却依然互敬互爱,相敬如宾。对于这些真正从枪林弹雨……65英寸液晶智慧屏怎么选?中高端液晶电视排行榜,海信电视怎么在液晶电视行业,想要做好,其实需要涉及到太多的技术,屏幕的光学技术、图像的显示计算技术,智能操控的特性等等,还有外观和设计的考量,液晶电视所用到的技术,并不亚于手机行业的技术含……浅析苏美尔文明1,起源的疑问在聊苏美尔文明之前,我们有必要先聊一下人类的起源问题。这个问题是被经常聊到的一个话题,这个谜团这么受关注的原因就是截止到目前为止,没有任何一套能够完美解释的理论。每……养生专家林海峰去世,终年51岁,反思5种养生方式不要也罢大米就是现代人饮食当中的毒药,吃米饭就等于服毒!想要排毒,不要吃任何固体食物,每天喝8杯蔬果汁,连喝5天7天,慢性病就可以治好,连喝10天,连癌症都可以治好!这是崇……就在刚才!詹姆斯一番话概括球队近况,湖人全民皆兵令人动容!北京时间1月15日,詹姆斯在无比赛日接受了媒体的采访。在采访中,记者首先谈到球队距离西部第六仅差2个胜场,詹姆斯说:是的,如果我们可以一起拿下一两场胜利。我认为我们最近一两个月……杜锋不服!京媒为何北京男篮能连胜广东浙江?雅尼斯又出神比喻为什么北京男篮能连胜广东男篮、浙江男篮?北京媒体表示:谁能想到三连败的北京首钢可以在经历2个加时的情况下,不敌福建男篮之后,面对两支强大的广东男篮和浙江男篮,可以取得两连……特别难过时才会发的句子,很烦很不开心,一吐为快生活的琐碎,吐出来是矫情,咽下去辣嗓子,百般委屈涌上心头,话到嘴边又觉得不值一提,生活就是这样,又难过又难说。Triviallife,ifspitoutisaffecta……神秘富豪密春雷的资本局,以及他和董卿的爱情神秘富豪密春雷又有新动作花60亿买地娶央视女神董卿的上海富商密春雷,又有新动作了!10月26日,冯小刚的电影公社发生股东变动,与冯小刚称为铁三角的华谊退出,而他们手……大海还要起舞,尽情的享受着大海的气息大海还要起舞,在清丽的蓝色中,我们沐浴着海风里的湿气,尽情的享受着大海的气息,聆听着大海温柔的鼾声,一起漫步在海的岸边。沙滩五百丈冰,海风吹树动。沙滩五百丈冰旗,飞瀑流水穿石,……最新!关于刘诗雯,有两件事说的很明白,其一是她这次不弃赛11月11日,国乒公布了12日热身赛对阵情况,整份名单,无论是女单,还是女单战男选手,亦或是混双等项目,均没有刘诗雯名字。可爱的小枣刘诗雯,没弃赛难道小枣弃赛吗?一……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网