Integer的自动装箱过程

先来看道题

 int  a=100;

 int  b=100;

 Integer  c=a;

 Integer  d=b;

 System.out.println(a==b);
 System.out.println(c==d);

其实这道题  和  a 与  b 没有什么关系,可以直接看成

  Integer c=100;
  Integer d=100;

System.out.println(c==d); 

执行结果为 true 

 当是如果把题目改为

  Integer c=200;
Integer d=200;

System.out.println(c==d);

执行结果却为false

这是为什么呢?

这就涉及到 Integer  的自动装箱了,

 我们都知道Integer是一个 类 不是基本类型数据,但是为什么它可以直接像基本类型数据一样可以直接赋值.

 这是在jdk1.5  之后引入的 自动装箱和自动拆箱.

 上面的问题实际上是使用了  Integer.valueOf()进行自动装箱的.

 等同于   

Integer c=Integer.valueOf(100);

对于为什么上面两个问题的执行结果会有不同,我们就需要看 Integer.valueOf()的源码了  

    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
 

IntegerCache.high和IntegerCache.low默认分别为    127  和-128

如果传入的值是在-128~127之间就会建立Integer实例并且把实例放入缓存中,

当再传入的值是缓存中存在的,就会把缓存中的实例返回.

如果不在 -128~127之间就不会把 实例放入缓存中.直接返回一个实例.


内容部分参考java jdk7 学习笔记






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值