专栏首页Java技术栈IntegerCache的妙用和陷阱!

IntegerCache的妙用和陷阱!

考虑下面的小程序,你认为会输出为什么结果?

public class Test { public static void main(String[] args) { Integer n1 = 123; Integer n2 = 123; Integer n3 = 128; Integer n4 = 128; System.out.println(n1 == n2); System.out.println(n3 == n4); } }

答案如下,请选择刮开:

true

false

是否和你预想的一致?

我们知道==比较的是对象的引用,那这里为什么会这出这种情况呢?

原理

首先这是JDK在1.5版本中添加的一项新特性,把-128~127的数字缓存起来了,用于提升性能和节省内存。所以这个范围内的自动装箱(相当于调用valueOf(int i)方法)的数字都会从缓存中获取,返回同一个数字,所以现在你理解为什么了吧。同时这也会给我们开发带来预想不到的陷阱,直得注意!!

而我们通过new Integer(1)这样就不会从缓存中获取,大家可以自行测试。

我们来翻看下jdk中Integer的源码

上面是IntegerCache的源码,把从-128~high放在缓存中

上面是valueOf的源码,先从缓存中获取,获取不到再new一个返回

从源码里面我们可以看到最小边界是-128,最大边界可以通过-XX:AutoBoxCacheMax进行配置,但也不会大于Integer.MAX_VALUE最大值。

扩展 这种缓存行为不仅用于Integer类,而且还用于Long,Short,Byte,Character,大家可以去这些类里面查看XxxCache的类和valueOf方法源码,原理大致相同,但它们的边界略有一二,也不能进行最大边界的配置。

本文分享自微信公众号 - Java技术栈(javastack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 傻傻分不清?Integer、new Integer() 和 int 的面试题

    1、Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2、Integer 变量必须实例化后才能使用,而int变量不需要 3、In...

    Java技术栈
  • SpringCloud Eureka自我保护机制

    自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行。...

    Java技术栈
  • 面试常问,缓存三大问题及解决方案!

    随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统...

    Java技术栈
  • 错误的将int定义为Integer造成程序无限执行下去,被骂惨

    前言:春节期间,坐在公司加班,本以为可以坐在那看看日志,打打游戏,聊会天一天就过去了,突然加群里我,为什么我的任务执行了快一上午了,怎么还是处理中。

    良月柒
  • Integer对象的一些误解

    这里先明确一个概念,对象之间的直等(==)比较的是两个内存的地址。而boolean byte char short int long float double八...

    zhangheng
  • Best practice on when to use the wrapper class and primitive type in Java

    在 Effective Java 的第五项中, Joshua Bloch 有这样的观点:

    职场亮哥
  • Spark算法整理(Java版) 顶

    我们首先用idea来搭建Spark项目,具体可以参考提交第一个Spark统计文件单词数程序,配合hadoop hdfs ,只不过我们现在用java语言来编写,而...

    算法之名
  • FunDA(9)- Stream Source:reactive data streams

        上篇我们讨论了静态数据源(Static Source, snapshot)。这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不...

    用户1150956
  • leetcode310. Minimum Height Trees

    在无向图的生成树中,我们可以指定任何一个节点为这棵树的根节点。现在要求在这样一棵生成树中,找到生成树的高度最低的所有根节点。

    眯眯眼的猫头鹰
  • 「码渣充电」《Nginx核心知识》反向代理与负载均衡原理

    第四部分中介绍反向代理与负载均衡,分为两大块,先介绍http 7层的反向代理,再介绍stream模块提供的4层负载均衡。在介绍反向代理的过程中,还会按照一种顺序...

    Java知音

扫码关注云+社区

领取腾讯云代金券