Java的auto-boxing与对象实例的比较

运行下面的程序:

 

public class test {
    public static void main(String[] args) {
        Object a = new Object();
        Object b = new Object();
        System.out.println(a == b);
    }
}

 

得到的结果是false,因为用==比较两个对象,系统会去比较此两个对象实例的内存地址,不同的对象实例,内存地址是不同的,所以结果会是false,因此我们正确地比较对象实例的方法是使用equal()方法。

 

再运行下面的程序:

 

public class test {
    public static void main(String[] args) {
        Integer a = new Integer(1);
        Integer b = new Integer(1);
        System.out.println(a == b);
    }
}

 

得到的结果也是和上面一样,不同的对象实例,内存地址是不同的。

 

请再运行下面的程序:

 

public class test {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 1;
        System.out.println(a == b);
    }
}

 

这次的结果会不会也和前面一样呢?答案是true。

为什么同样是2个对象用==做比较,结果会不一样呢?这个程序和上面一个唯一的区别就是这里使用了auto-boxing把一个primitive的类型自动转化成wrapper class对象,既然是2个Integer的实例对象,为什么会内存地址相等呢?

 

原来按照Java虚拟机的规范:特定的primitive一定得被auto-box成相同的不可变的wrapper class对象,这些对象会被高速缓存以便重复使用。这些特定的值包括:boolean值的false与true,所有的byte值,介于-128到128之间的short和int值,以及介于0到0x7f之间的所有char值。

 

所以,运行下面的程序我们就知道,结果一定是false:

 

public class test {
    public static void main(String[] args) {
        Integer a = 256;
        Integer b = 256;
        System.out.println(a == b);
    }
}

 

因为256不在这个特定的范围以内。

 

务必注意这个问题,不然会引入一些古怪的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值