深入了解java自动装箱和拆箱

今天看《深入理解JAVA虚拟机》,发现自己对自动装箱和拆箱有一些误解,在此写下来:

问题1、

    Integer a = 3;

    Integer b = 3;

请问 a==b 返回 true 还是 false ?

开始毫不犹豫选择了false ,明显 a和b不是同一个对象。结果亲自运行这段代码发现返回true。

问题2、

     Integer c = 333;
    Integer d= 333;

请问 c==d 返回 true 还是 false ?

亲自试验之后问题2返回false。c.equals(d) 返回true。

不解了吧?如果问题1返回true,问题2为什么返回false呢?

首先说下自动装箱:Integer自动装箱时是调用valueOf(int i)来完成自动装箱的,再来看Integer的valueOf(int i)的源码:

 public static Integer valueOf(int i) {
 final int offset = 128;
 if (i >= -128 && i <= 127) { // must cache
     return IntegerCache.cache[i + offset];
 }
        return new Integer(i);
    }

原来-128-127之间的整数返回的是缓存,大于这个区间的才返回新的Integer对象。

再来看看Integer的equals方法:

public boolean equals(Object obj) {
 if (obj instanceof Integer) {
     return value == ((Integer)obj).intValue();
 }
 return false;
    }
不难看出Integer对象的equals方法比较的是Integer拆箱之后的值。自动拆箱是调用initValue方法来实现的。

总结:对于基本类型的包装类型,Byte、Short、Integer、Long、Character 都存在这样的缓存机制,大家在使用字面量初始化对象,然后进行== 比较的时候需要留心注意。
Float、Double没有这样的机制。
Boolean 计较特使,字面量的初始化后,== 操作会返回Boolean类静态变量的计较,也可以当做一种缓存吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值