有趣的IntegerCache

一个很有趣的现象,下面这两个结果输出的结果是false true,这是为什么?

      翻看Integer的源码可以看到,当new Integer(12);时,没有什么特别的,就是通过构造方法创建了一个Integer的对象,并将12赋值给对象的变量value。因此a!=b是正常的。而上面c==d是true就很奇怪,用javap -c Test.class 查看编译后的结果发现:Integer c = 12;这个操作在JVM中被优化成为了Integer.valueOf(12);

于是移步到Integer的valueOf(int i);这个方法:

发现一个很有意思的东西,在Integer中存在有一个IntegerCache这个内部类:

      它在初始化的时候将256个对象(从-128到127)[补充一下,这个最大值127是可以通过AutoBoxCacheMax进行配置的,只是默认为127],作为Integer的cache,也就是说它利用一个Integer cache[];提前创建了this.value = -128 ~ 127的对象放入到cache中。回到上面分析Integer c = 12;与Integer d = 12;c==d发现原来c和d根本就是cache中的同一个对象,自然返回的是true。搞懂了这个是不是觉得很多问题迎刃而解!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,786评论 18 399
  • 下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题...
    独念白阅读 1,404评论 0 3
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,788评论 0 33
  • PPMESSAGE 可以实时跟踪网站的每一个访客,并且能够精确衡量每个访客在每个页面上停留的时间,与传统的网页跟踪...
    丁贵金阅读 969评论 0 0