城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

Integer缓存那点小事儿

6月22日 飞仙轩投稿
  开启掘金成长之旅!这是我参与掘金日新计划2月更文挑战的第2天,点击查看活动详情
  Integer面试中我们经常被问到,另外工作中我们也经常遇到Integer的比较,所以今天来快速总结下这个知识点。
  首先我们假设声明了两个局部变量:Integeri200;Integerj100;复制代码
  事实上,Java最终的逻辑是不管你后边的数是多少,最终都会调Integer。valueOf(i);来将给定的数值,进行装箱操作,但是里边会判断,就是如果给定数值i是在127128之间的数值,那么将会从一个Integer类型的缓存数组中拿到指定位置(即index是给定数值的)对应的Integer对象,如果给定数值i不在127128范围内,那么将会在堆上开辟空间,new一个Integer对象出来
  空口无凭,我们使用命令反汇编一下,看看到底是是不是会像上边说的那样;执行命令:
  JavappvctargettestclassescomxzlltestmianshiIntegerCacheTest。class
  结果如下:
  2。IntegerCache初始化源码valueOf简析
  我们看下这个逻辑,Integer类源码如下:publicfinalclassIntegerextendsNumberimplementsComparableInteger{privatestaticclassIntegerCache{下界staticfinalintlow128;上界,可通过XX:AutoBoxCacheMaxsize来调整大小,但是不能超过Inter。MAX,并且小于127的话,就还是取127这个就是存储Integer对象的数组了staticfinalInteger〔〕staticInteger〔〕archivedCstatic{highvaluemaybeconfiguredbypropertyinth127;StringintegerCacheHighPropValueVM。getSavedProperty(java。lang。Integer。IntegerCache。high);一堆判断,判断是用你配的?还是默认的?,上限值if(integerCacheHighPropValue!null){try{intiparseInt(integerCacheHighPropValue);iMath。max(i,127);MaximumarraysizeisInteger。MAXVALUEhMath。min(i,Integer。MAXVALUE(low)1);}catch(NumberFormatExceptionnfe){Ifthepropertycannotbeparsedintoanint,ignoreit。}}LoadIntegerCache。archivedCachefromarchive,ifpossibleVM。initializeFromArchive(IntegerCache。class);intsize(highlow)1;Usethearchivedcacheifitexistsandislargeenough新建一个Integer数组,初始值为128,127,。。。,0,1,2,。。。,127if(archivedCachenullsizearchivedCache。length){Integer〔〕cnewInteger〔size〕;for(intk0;kc。k)c〔k〕newInteger(j);赋值给archivedCache变量archivedC}赋值给cache变量cachearchivedCrange〔128,127〕mustbeinterned(JLS75。1。7)assertIntegerCache。high127;}privateIntegerCache(){}}publicstaticIntegervalueOf(inti){if(iIntegerCache。lowiIntegerCache。high)returnIntegerCache。cache〔i(IntegerCache。low)〕;不newobject,而是直接从cache中读出object返回returnnewInteger(i);new一个Integer对象返回}}复制代码
  上边代码比较简单,我们不过多展开了3。演示一下各种对比以及结果:publicstaticvoidmain(String〔〕args){inti1200;Integeri2200;System。out。println(i1i2:结果:(i1i2),int和new出来的Integer(因为200不在(127128)区间,所以会new对象)比较,i2会自动拆箱所以会变成两个int的比较);Integeri3200;编译后,此处变为Integeri3Integer。valueOf(200);也就是说不会从IntegerCache中获取,而是new了一个对象Integeri4200;System。out。println(i3i4:结果:(i3i4),由于200不在缓存127128之间,所以此处是两个对象的比较,i3内存地址:System。identityHashCode(i3),i4内存地址:System。identityHashCode(i4));Integeri15newInteger(100);Integeri16newInteger(100);System。out。println(i15i16:结果:(i15i16),i15和i16是new的两个对象,i15内存地址:System。identityHashCode(i15),i16内存地址:System。identityHashCode(i16));Integeri17100;System。out。println(i15i17:结果:(i15i17),由于i15是new的对象,i17是从Integer缓存数组中拿的对象,两个都是对象,i15内存地址:System。identityHashCode(i15),i17内存地址:System。identityHashCode(i17));Integeri18100;System。out。println(i17i18:结果:(i17i18),由于100在缓存127128之间,所以此处是两个相同对象的比较(因为都是从数组中拿的同一个index位置的Integer对象),i17内存地址:System。identityHashCode(i17),i18内存地址:System。identityHashCode(i18));inti100100;System。out。println(i5i100:结果:(i15i100),由于i100是基础类型,和从Integer缓存中拿出来的i17(Integer对象比较)比较,i17会自动拆箱,结果自然是true);}复制代码
  输出:i1i2:结果:true,int和new出来的Integer(因为200不在(127128)区间,所以会new对象)比较,i2会自动拆箱所以会变成两个int的比较i3i4:结果:false,由于200不在缓存127128之间,所以此处是两个对象的比较,i3内存地址:706197430,i4内存地址:1325808650i15i16:结果:false,i15和i16是new的两个对象,i15内存地址:510464020,i16内存地址:1987083830i15i17:结果:false,由于i15是new的对象,i17是从Integer缓存数组中拿的对象,两个都是对象,i15内存地址:510464020,i17内存地址:1632492873i17i18:结果:true,由于100在缓存127128之间,所以此处是两个相同对象的比较(因为都是从数组中拿的同一个index位置的Integer对象),i17内存地址:1632492873,i18内存地址:1632492873i5i100:结果:true,由于i100是基础类型,和从Integer缓存中拿出来的i17(Integer对象比较)比较,i17会自动拆箱,结果自然是true复制代码
  (idea运行)附图如下:
  3。1做个小总结无论如何,I与newInteger(xxx)不会相等。不会经历拆箱过程两个都是非new出来的Integer对象(即Integerixxx),如果xxx在128到127之间,则是true,否则为false两个都是new出来的,都为falseint和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比4。事实上,不仅Integer这么做,其他也有类似做法,如下有ByteCache用于缓存Byte对象有ShortCache用于缓存Short对象有LongCache用于缓存Long对象有CharacterCache用于缓存Character对象
  Byte,Short,Long有固定范围:128到127。对于Character,范围是0到127。除了Integer可以通过参数改变范围外,其它的都不行。
  可以看出来jdk的大佬们是多么的追求极致!
  一天一小步,一年一大步!
  ps:今晚是通宵上线的一晚,请bug远离我
投诉 评论

三八节免门票!南阳五朵山旅游大使招募大赛等你来河南日报客户端记者温小娟实习生孙婷婷九龙湖、万福宫、金顶、暴瀑峡。。。。。。山野湖边畅快吸氧,捕捉云端浪漫,高山观景台瞭望,南阳五朵山旅游度假区为你解锁最美春天。令人惊喜……Integer缓存那点小事儿开启掘金成长之旅!这是我参与掘金日新计划2月更文挑战的第2天,点击查看活动详情Integer面试中我们经常被问到,另外工作中我们也经常遇到Integer的比较,所以今天来……认知的觉醒1来自教育,剩下的99全部来自千刀万剐认知模糊,行为就会模糊。巨大的失败,来自巨大的无知。认知的觉醒,1来自教育,剩下的99,全部来自千刀万剐。这个世界99的老板,全部全部站在愚昧之巅。情绪不稳定,抱怨……这5种吃主食的方法,糖尿病患者人手一份,控血糖还能吃饱糖尿病人在吃的方面限制颇多,因为血糖的升降和摄入的饮食有很直接的关系。只要确诊为糖尿病,那么控制饮食就是他们必修的功课。但是很多糖尿病患者将控制饮食与控制主食划上了等号,……国表鉴赏之红旗手表保养这块红旗手表的外观看起来惨不忍睹,表蒙划痕磕碰,后盖金属划痕。但是透过迷雾看真相,表盘大概率应该还是不错的。H标的Logo和整体设计风格相当协调,特别是这块,偏玫瑰金色的……女排姑娘张常宁好内容我来评张常宁1995年11月6日出生于江苏省常州市,中国女子排球运动员,场上司职主攻,现效力于江苏中天钢铁女排俱乐部。张常宁出生在一个体育世家,父亲张友生和哥哥张晨……赛拉斯再现经典甩锅,夸赞尼克斯贬低申京,这就是所谓眼光独到?今天NBA最被热议的事情,肯定是利拉德豪取71分,带队获得胜利,不过火箭队已经连续两场比赛被当作背景,赛后记者本来想听听球队教练对于比赛失利的看法,没想到成了赛拉斯的甩锅大会。……特斯拉Model3的对手,12月销售9094台,长安深蓝SL在国内汽车市场,不少车企都将特斯拉这个品牌作为竞争对手,比如在轿车市场中,长安深蓝SL03这台车就一直被视为特斯拉Model3的对手。参考懂车帝早前发布的销售数据,这台车在过去……3月这几天,别错过!星空有约3月天象剧场,金星有点忙海报制作:冯娟3月天象剧场大幕将起,好戏连台,其中,金木相合要把握,月掩金星别错过。3月2日傍晚时分的西方天空,太阳系中最亮的……智商机层出不穷,小米13系列凭借MIUI14杀出重围对于智商税,其实在各行各业都不少见,不过在手机市场,所谓的智商税说法却要更多,比如所谓的智商机以及被不少网友吐槽买苹果交智商税。最离谱的是,网上还有卖充电器保护套的,手机保护套……港股收评恒生指数涨0。47游戏博彩股走强,新东方在线跌81月18日港股震荡,截至收盘,恒生指数涨0。47,报21678点,恒生科技指数涨0。54,报4524。67点,国企指数涨0。36,报7340。73点,红筹指数涨0。65,报39……全屋智能家居品牌应该怎么选摩根智能家居最受用户青睐随着物联网人工智能飞跃式发展,智能家居也逐渐成为了装修的主流,高品质的智慧生活理念已经深入人心,消费者愿意为自己的爱家融入现代科技,智能家居成为时代发展的新趋势。今天我们就来聊……
拼多多买车历程和建议分享法意瑞之一巴黎4真敢说!马健进国家队不靠水平靠人情世故,当年我就被司长耍了再战K1霸主,中国名将张春雨对决世界第一的热血之役万象天工欢乐多,各路玩法请随便挑,玩不尽兴你来找我演员壮丽目睹唐国强与岳父母的10万闹剧,带继女走出丧母的阴影欢乐颂3明明官宣过,孙千怎么悄悄被换角了呢?杜若溪嫁男神偶像严屹宽,两度流产生女,风光幸福背后有艰辛英雄联盟最适合新手练的简单又能carry的英雄杜锋一双儿女久违亮相!哥哥带4岁妹妹骑自行车,暖心又有爱中国油价5连涨!原因何在?国际油价突然暴跌,国内会继续涨吗?张常宁大婚照曝光!穿中式礼服美到令人窒息,CBA老公大威猛本人造句用本人造句大全空调应该如何清理空调的清理方法介绍详解当情人节撞上元宵节,来汤河温泉感受双倍快乐!我最欣赏的一个人吃话梅可以解酒吗?互联网大厂喜欢哪些大学(二)阿里校招最青睐的大学有哪些我最喜欢去玩的地方邓紫棋为什么叫gem社区消防安全基础知识总结交通肇事2死1伤法院判决多少年?奇怪旋转脉冲星两个状态随时切换樱桃的英语怎么读樱桃的英语是什么

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找