Integer.IntegerCache

1.引言

下面一段代码,其输出结果如下所示。本文主要讲解输出的原因。

Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);//true
System.out.println(c == d);//false

2.原因分析

上面一段代码在编译之后,对于Integer的构造会有自动装箱的过程。所以上面的代码等价于下面的代码。

Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
Integer c = Integer.valueOf(128);
Integer d = Integer.valueOf(128);
System.out.println(a == b);//true
System.out.println(c == d);//false

我们又知道使用==进行对象的比较时,是对其引用进行的比较。
我们查看Integer.valueOf(int)方法的源码,发现Integer在构造对象时,会先判断值的大小,若该值在一定范围内,则会从cache中获得对象,而不会new一个新的对象。
Integer.vallueOf方法源码

3.Integer.IntegerCache

IntegerCache是Integer私有的静态的内部类。其中包含一个Integer类型的静态数组cache。并且有一段静态代码块,在类加载时就会构造cache数值,之后在创建Integer对象时,就会优先从cache中获得对象。从源码中我们可以看出cache默认的范围是-128 到 127,也就是说使用Integer.valueOf方法构造Integer对象时,若值在-128到127之间是不会创建新的对象的,而是直接从cache数值中获得。所以1、2两段中的 ab 结果为true,而cd结果为false。
Integer.IntegerCache

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值