美文网首页
IntegerCache的妙用和陷阱!

IntegerCache的妙用和陷阱!

作者: Java技术栈 | 来源:发表于2020-09-29 08:25 被阅读0次

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

    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方法源码,原理大致相同,但它们的边界略有一二,也不能进行最大边界的配置。

    近期热文推荐:

    1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

    2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

    3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    4.吊打 Tomcat ,Undertow 性能很炸!!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

    相关文章

      网友评论

          本文标题:IntegerCache的妙用和陷阱!

          本文链接:https://www.haomeiwen.com/subject/dzmsuktx.html