设为首页 加入收藏

TOP

Java的auto-boxing与对象实例的比较
2014-11-24 08:34:50 来源: 作者: 【 】 浏览:0
Tags: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不在这个特定的范围以内。


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于Android屏幕解锁与持续开亮 下一篇Android Smart Dict - 开篇

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)
·想要自学数据分析, (2025-12-27 02:49:14)
·Java 集合框架 - 菜 (2025-12-27 02:19:36)
·Java集合框架最全详 (2025-12-27 02:19:33)