范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

JavaInteger好大一坑,一不小心就掉进去了

  遛马少年,一个代码写的很6的程序员,专注于技术干货分享
  最近,在处理线上bug的时候,发现了一个奇怪的现象
  业务代码大概是这样的public static boolean doSth(Integer x, Integer y) {    if (x == y) {       return true;    }    //do other...    return false; }
  当x、y都是较小的值时,比如100、100,正常返回true
  当是较大值时,比如500、500,反而返回false
  难道100==100,500!=500吗?
  带着这样的疑问,我写了个demo程序一探究竟public class IntDemo {     public static boolean doSth(Integer a, Integer b) {       if (a == b) {          return true;       }       return false;    }     public static void main(String[] args) {       int a = 100;       int b = 500;       System.out.println(doSth(a, a));       System.out.println(doSth(b, b));    } }
  输出结果为:
  奇怪!底层是怎么处理的呢?我用javap看了一下上面代码的字节码指令public class com.integer.IntDemo {   public com.integer.IntDemo();     Code:        0: aload_0        1: invokespecial #1                  // Method java/lang/Object."":()V        4: return    public static boolean doSth(java.lang.Integer, java.lang.Integer);     Code:        0: aload_0        1: aload_1        2: if_acmpne     7        5: iconst_1        6: ireturn        7: iconst_0        8: ireturn    public static void main(java.lang.String[]);     Code:        0: bipush        100        2: istore_1        3: sipush        500        6: istore_2        7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;       10: iload_1       11: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;       14: iload_1       15: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;       18: invokestatic  #4                  // Method doSth:(Ljava/lang/Integer;Ljava/lang/Integer;)Z       21: invokevirtual #5                  // Method java/io/PrintStream.println:(Z)V       24: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;       27: iload_2       28: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;       31: iload_2       32: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;       35: invokestatic  #4                  // Method doSth:(Ljava/lang/Integer;Ljava/lang/Integer;)Z       38: invokevirtual #5                  // Method java/io/PrintStream.println:(Z)V       41: return }
  可以看到,doSth函数传入的实参是int类型,函数定义的形参却是Integer类型
  看到第11行字节码指令我就懂了,原来是通过Integer.valueOf 来做的一个int的自动装箱
  11: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  所以,问题肯定出在Integer.valueOf里面,接着,我点开valueOf的源码public static Integer valueOf(int i) {     if (i >= IntegerCache.low && i <= IntegerCache.high)         return IntegerCache.cache[i + (-IntegerCache.low)];     return new Integer(i); }
  好家伙,这里用到了一个缓存类:IntegerCache
  判断如果在缓存范围内,直接返回这个缓存类持有的引用,否则就new一个Integer对象
  再点开这个缓存类,low=-128,high=127
  这就解释了为什么100是true,500是false了
  JDK为什么要设计这样一个很容易掉进去的坑呢?
  其实,在valueOf方法上,官方已经给出了说明:/**  * Returns an {@code Integer} instance representing the specified  * {@code int} value.  If a new {@code Integer} instance is not  * required, this method should generally be used in preference to  * the constructor {@link #Integer(int)}, as this method is likely  * to yield significantly better space and time performance by  * caching frequently requested values.  *  * This method will always cache values in the range -128 to 127,  * inclusive, and may cache other values outside of this range.  *  * @param  i an {@code int} value.  * @return an {@code Integer} instance representing {@code i}.  * @since  1.5  */
  大概意思就是,-128 127 的数据在 int 范围内是使用最频繁的,为了减少频繁创建对象带来的内存消耗,这里其实是用到了享元模式,以提高空间和时间性能。
  既然Integer这样设计了,其他类会不会也有呢?
  接着,我又看了其他数据类型,用缓存的还不少,这里我给各位列一下,防止你们以后踩坑
  小伙伴们在开发过程中,也要注意,避免掉进这个坑里。
  好了,今天的分享就到这里了,如果你觉得有用,麻烦给兄弟点个小赞,这样我才更有动力去分享更多技术干货~

三队大交易方案出炉!杜欧联手约基奇组三巨头,本西搭档锡安莺歌北京时间7月12日,美媒FadeawayWorld晒出了一笔三方大交易的方案,认为这能打造终极三赢的局面。这笔交易能让杜兰特和欧文加盟掘金,联手约基奇组新三巨头。西蒙斯加盟鹈鹕,联苹果公司拒绝对中国退让?中国移动国人当自强这几年时间中,国产手机绝对是突飞猛进一般的存在,在很多方面都已经做到了国际先进水平,在体验上都是目前整个手机行业中的佼佼者,像华为和小米等厂商,甚至都做到了世界出货量前三的水平,不预防肺部肿瘤,这4种方法很有效,很多人还不知道我们生活中有很多人被肿瘤疾病所伤害,甚至失去了生命。肺癌是大家非常熟悉的一种肿瘤。其实肺部肿瘤是完全可以预防的,只是很多人不知道怎么预防,很多坏习惯改不了,最后得了肺癌,这些是完全肠胃炎和胃肠炎有什么区别?治疗方法有哪些?这些你都知道吗尽管肠胃炎和胃肠炎可能是由于饮食不当引起的,但肠炎主要是因为食物不正确导致病毒或细菌等病原体对肠道粘膜刺激而诱发的炎症异常。除了饮食外,还可能造成消化不良,药物刺激或化学刺激和其他什么都没做就很累,教您三个方法缓解您是否也有这些情况?明明什么都没做,就是感觉到很累,浑身没劲儿,气短懒言,平时还会出现头晕心慌,脸色也不好,这不是懒,而是气血不足。今天就交给您三个办法缓解气血不足。一调理脾胃。脾焦虑失眠怎么办?有什么好的方法吗?睡眠对一个人的影响很大。一个人一生中几乎有三分之一的时间是在睡眠中度过的。如果焦虑失眠,很容易导致工作效率下降注意力不集中头痛头晕。很多失眠的人还会患上其他疾病,所以焦虑失眠是一种乐视还有400多位员工过着没有老板的神仙日子日前,IT博主Fenng分享了一则冷知识乐视居然还剩下400多人,有不少是五年以上的老员工。并表示幸福感是很多老乐视人留下来的理由,没有内卷和996,没拖欠过留下来的员工的工资,也400亿储蓄国债线上额度一分钟内被抢光?为啥国债那么火?国债熟悉投资市场的朋友都知道,大部分的金融市场投资都可以分成股票基金债券等几个部分,而在债券之中大家最熟悉的无疑是国债产品,国债由于低风险,也往往被称为金边债券。不过,最近一次的国信用卡外包催收策略,银行报案通知派出所协商还款,是真的吗?有些人信用卡使用不当或者消费过量,结果在账单日无法及时还款,导致欠款逾期了。在之后的时间内,很多持卡人都采取的是有点资金就还一点,虽然无法将账单一次还清,但是陆陆续续都在还。在这种示范应用能否擦亮高端医疗装备自主招牌7月11日,工信部公开征求高端医疗装备应用示范基地管理办法(试行)意见,申报成功的主体将由地方政府牵头构建创新生态环境推动产业发展,其装备也将优先推荐至首台(套)重大技术装备推广应摩托罗拉第三代折叠屏手机MOTORazr2022官宣,曾首创业内竖向折叠屏设计7月12日,摩托罗拉放出了第三代折叠屏手机Razr2022的官宣视频。不过,早在5月份,外媒91mobiles就已经放出了Razr3代的真机图以及参数。而爆料大神evleaks更是
每日数码简报2022。10。11星期二农历九月十六20221011历史上的今天1957年10月11日世界最大的望远镜在英国建成。01hr2022年前8月中国智能平板电脑线上零售市场销量达719万台苹果第一,华为第各种失误毫无节奏!TES输给RGE,两连败后晋级八强岌岌可危S12小组赛第四天,在JDG有惊无险拿下G2取得胜利后,二号种子TES也迎来了自己第一轮的收官战,对阵欧洲一号种子RGE。TES在对阵DRX失利后,大家也很担心他们目前的状态,而与鬼泣系列每一部都在讲述什么鬼泣3但丁为了寻找杀死自己母亲的恶魔,开了一家恶魔猎人店。维吉尔被权力蛊惑,所以他决定用但丁的血来解开封印。最后,他知道了两兄弟联手杀死被蛊惑的人的一切。然后维吉尔被但丁打败,留在RNG大战100T,100T北美东道主被击沉大家好,我是游戏爱好者Seven,今天结束的S12全球总决赛,LPL赛区2胜1负RNG对战100T在我感觉纯粹就是像是打Rank一样,小虎在输给DRX的时候被嘲讽不会阿卡丽,今天小英雄联盟S12小组赛首轮结果,LCS赛区全败落幕,LPL一队恐难出线2022电竞季伴随着DRX击败GAM,小组赛第一轮的赛程也是落下帷幕。在首轮比赛中各赛区战绩分别为LPL93LCK84LEC63LCS09VCS03PCS12其中LPL赛区战绩最佳LOLS12外网热议TES不敌RGE,现在的TES是knight和四个Wayward在北京时间10月11日上午,2022全球总决赛小组赛第四日的比赛中,LPL二号种子TES不敌欧洲LEC一号种子RGE,小组赛第一轮遭遇两连败,出线形势异常严峻,让我们来看一下外网的英雄联盟s12小组赛第一轮结束,LPL9胜3负,TES陷入淘汰边缘截止到今天,英雄联盟s12全球总决赛的小组赛第一轮已经正式结束了,目前12支队伍都已经经常的三场bo1的比赛,而接下来的时间将会有两天的休息时间,之后就会正式开始按照积分来争抢出线你永远可以相信Killa和他的武器RPK16漫谈在逃离塔科夫中,有一位BOSS具有极高的人气,噩梦滑铲者阿迪王都是玩家给他的尊称。如果你发现了他,或许远距离用狙打掉是个不错的选择。可要是失手,你就要面对那个男人的怒火了,滑铲锁头坦克世界闪击战9。3官方答复问题1RU服务器上会有版本9。4的测试吗?答从9。4开始,它不会在RU服务器上。问题2那么未来的测试呢?回答我们不能肯定。闪电战问题3WoTBlitz和TanksBlitz之间会有梦游一战!三大后卫合砍4分,总决赛MVP成冲冠隐患,杨鸣失算了虽然上半场打得有些乱,但辽宁男篮最终还是击败了广厦,取得揭幕战的开门红。本场比赛,李晓旭体现出一位老将的价值,砍下6分4抢断5盖帽。也有打出梦游一战的球员,例如赵继伟鄢手骐周俊成,王思聪女友晒情侣拖鞋!穿短裙光着一双大长腿,膝盖上淤青太抢镜近日,王思聪女友慎婕在社交平台上晒出了一张居家照,画面中只有她的一双腿,和两双情侣款的拖鞋,虽然没有露出男方的太多信息,但还是会让人忍不住猜测男款拖鞋的主人会不会就是王思聪?除了拖