专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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;}

王楚钦在全运会男单中的糟糕表现,你还看好他的未来吗?王楚钦在全运会上的表现虽然不能算完美但还是不错的。他与队友合作夺得男团亚军,与马龙合作夺得男双冠军,在单打比赛中打进四强,这也能说得过去了。如果看实况转播了就会发现,王楚钦左肩有伤为什么很多人会认为氢能源汽车才是未来的方向,而电动车是过渡?原因在于德日韩主攻氢能汽车电动汽车和氢能汽车哪个才是未来方向?理性的解读应当是电动汽车,不过一般汽车爱好者倒是有些会认为氢能汽车更有前景究其原因主要是以德系日系和韩系车企为主,将这宜昌未来的发展潜力有多大?宜昌,著名的世界水电之都钢琴之城中国最具幸福感城市名列前茅中国城市综合竞争力百强全国文明城市中国自然流域漂流之都中国旅游胜地四十佳国家森林城市中国优秀旅游城市中国特色魅力城市20050万存款和每个月退休工资5000元哪种老人过得舒服?为什么?作为一名银行的工作人员,我可以明确告诉你有500000元存款和每月5000元退休金的老人,绝对是拿着每个月5000元退休金老人过得更舒坦一些。为什么说拥有每个月退休金5000元的老如何修复敏感肌和过敏肌肤?敏感肌肤一旦受到刺激,皮肤立即会出现发红发痒脱皮的现象。特别是在换季时节,更要注意皮肤的护理工作,只有采取正确的护肤方法才能有效降低肌肤敏感度,提升肌肤抵抗力!1。洁面洗面奶爽肤水换肾后,最多能活多少年?我知道的是我同学的母亲,我们92年在中专上学时候,他妈换的肾,当时换的是一个二十多岁男的死刑犯的肾。当时还允许,那时候她妈四十多岁,一直坚持到三年前,也就是2018年换的肾也坏死了上通G20车怎么样?车大了,老百姓说小点就好了家用还省油,车小了老百姓说空间不行,不大不小了发动机变速箱底盘又不行,三大件好了,品牌又不行,品牌行了价格又不行,都行了,老百姓说我钱不行,但我嘴行把尺寸都说豆腐的食谱最多,你都吃过哪些?都说豆腐的食谱多,你都吃过哪些?豆腐营养价值高,以豆腐为主料做出来的菜那真的数不胜数,通常也是经常能吃到的家常菜。豆腐的做法多种多样,可炒,可炖,可油炸。豆腐的食谱那么多,到目前为假设鸿蒙约等于安卓,那它对华为的存在意义是啥?不管它这个东西有没有意义,对于发明的这个东西的人,他肯定是想尽脑瓜的。不管结果怎么样,努力就行,蒙心自问就行小区里的房子设计得都差不多,但只有这套是我的是我的这三个字就算鸿蒙对华为吸引你的地方是什么?感谢邀请!这样的提问出现了很多不同的版本。我也回答了有关今日头条的很多提问。今日头条吸引着几亿人,几亿人拿着手机看今日头条。今日头条得到了无数网民认可!今日头条的魅力传播正能量的集如何帮助高三男生安全渡过青春期?从发展心理学的角度,高三已经处于青春期的晚期了,也就是说这个时期本不应该存在什么太危险的事了,而且又是高三,学业压力是前所未有的,所以正常情况下不存在题主说的安全一说。这个安全是不
华兴资本包凡失联震动投资圈,与前高管违规操作有关?作者付影李海霞编辑高远山来源独角金融乍暖还寒之时,华兴资本(1911。HK)发布其创始人董事长包凡失联的公告,瞬间划破了本就不平静的金融圈。华兴资本公告显示,公司暂时无法与包凡取得关乎股民钱袋子!全面注册制来了,十问如何上车?图IC全面注册制,来了。2月17日,中国证监会发布全面实行股票发行注册制相关制度规则,自公布之日起施行。当天,证券交易所全国股转公司中国结算中证金融证券业协会配套制度规则同步发布实山东莘县楼市的危机,激进的莘县,低廉的房价,莘县楼市的潜力山东省地处东部沿海,是全国经济总量排名第三的省份。对于山东省而言,城市化极其重要,毕竟这个区域的常住人口超过1亿人。总体来说,县级城市的发展空间要比普通的地级中心城区要低一些。但对如何看待背离的金融数据1月金融数据喜忧参半1月信贷开门红如期而至,人民币贷款同比多增9227亿元但社融同比少增1959亿元,社融同比增速9。4,较12月继续下滑0。2个百分点。2023年2月10日,央行金科组织大调整,离职了两位区域董事长2月10日,金科地产集团股份有限公司发布了关于公司债务情况的公告截至2023年1月末,公司合并报表范围内总有息负债规模为684。15亿元,较2021年末减少121。95亿元其中一年高质量发展优秀案例光明发展新引擎产业聚集大效应近年来,国家高度重视汽车消费产业发展,汽车消费产业已然成为国民经济的支柱产业之一,以商业文旅汽车展销三位一体的光明国际汽车城备受关注。作为市区重大项目项目之一,深圳光明汽车城已逐渐市中区以重大项目建设强引擎,推进高质量发展加速跑记者于悦通讯员裴梦雪孔雪抓项目就是抓发展,大项目引领大发展。今年市中区贯彻落实全市2023年项目突破年工作动员大会精神,举全区之力加快重点项目建设,不断提升产业发展能级,推动实现经西域春奶制品年产量3年将增5倍咋实现石榴云新疆日报记者盖有军新年开新局,今年我们公司将开启企业成立以来的二次创业,争取用3年时间,投资7亿元,建成日处理1500吨乳制品生产能力,年产量将由目前的11万吨增长到50万吨超223亿元!莱西77个重大项目集中开工不负好春光,项目开工忙。2月17日上午,随着一声令下,莱西市总投资超223亿元的77个重大项目集中开工,吹响攻坚克难年加快项目建设的冲锋号。该市上下只争朝夕铆劲赶超,以干实干好快干万泰生物研究报告双赛道池大水深,研发平台助力长期增长(报告出品方作者东北证券,刘宇腾,杨绪朋)1。多年深耕IVD领域,国产HPV疫苗先行者1。1。公司简介公司主要开展IVD试剂与疫苗研发及生产销售业务,技术底蕴深厚。北京万泰生物药业直面市场竞争,马斯克称不介意特斯拉破产日前,话题制造者马斯克又惊爆新言论。在最近举办的一场峰会上,特斯拉董事会成员日本政府养老投资基金前首席投资官水野弘道(HiromichiMizuno)对外透露,特斯拉CEO马斯克曾
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网