Java中Integer类的自动装箱和自动拆箱

所谓自动装箱,就是把基本数据类型用他们对应的引用类型包装起来,使他们可以具有对象的特质。例如我们可以把int类型包装成Integer类型的,把double类型的包装成Double类型的。

所谓拆箱,就是进行与自动装箱相反的操作。

自动装箱的过程:当需要一种类型的对象时,这种基本数据类型就自动封装到与它对应的包装类中。

自动拆箱的过程:当需要一个数值时,被装箱的对象中的值就会被自动提取出来,没有必要再去调用intValue()和doubleValue()等方法。

public static void main(String[] args) {
        Integer a=100;
        Integer b=100;
        Integer c=200;
        Integer d=200;
        System.out.println(a==b);//1
        System.out.println(a==100);//2
        System.out.println(c==d);//3
        System.out.println(c==200);//4
    }

在java中,"=="比较的是对象的引用,而不是值(value),自动装箱后a,b,c,d都是Integer类型的对象,因此"=="比较的是其引用。按照常规思维1和3应该是false,但是结果是:
true

true

false

true

2和4是因为进行了自动拆箱,比较的是基本数据类型,因此"=="比较的是其数值,结果数true。

对于结果1,虽然比较的是对象的引用,但是自动装箱时,java在编译的时候Integer a=100,被编译成Integer a=Integer.valueOf(100)。因此,关键就在于valueOf()这个方法。

再看下面的例子:

Integer aa=-128;
        Integer bb=-128;
        System.out.println(aa==bb);
        Integer cc=-129;
        Integer dd=-129;
        System.out.println(cc==dd);
        Integer ee=127;
        Integer ff=127;
        System.out.println(ee==ff);
        Integer gg=128;
        Integer hh=128;
        System.out.println(gg==hh);

上面代码输出的结果是:
true
false
true
false
说明当Integer类型后面赋值范围在-128---127之间时,都会返回true,否则返回false。


总结:

事实上,java为了提高效率,IntegerCache类中有一个数组缓存了值从-128到127的Integer对象。当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,会直接从这个缓存中返回一个对象,否则就new一个Integer对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值