Java自动装拆箱boxing与unboxing

来源:互联网 发布:iphone5s没有4g网络 编辑:程序博客网 时间:2024/05/13 07:49

参考文章:

1. http://www.thinksaas.cn/group/topic/193796/

2. http://www.linuxidc.com/Linux/2011-04/34604.htm

3. http://www.cnblogs.com/mingcn/archive/2010/10/20/JavaAutoBoxing.html


先看下面一段代码,想想它的输出结果是什么?

Integer a = 100;Integer b = 100;Integer c = 1000;Integer d = 1000;Integer e=new Integer(100);Integer f=new Integer(100);int m=100;System.out.println(a == b);System.out.println(a.equals(b));System.out.println(c == d);System.out.println(c.equals(d));System.out.println(e == f);System.out.println(e.equals(f));System.out.println(e == m);System.out.println(a == m);System.out.println(a.equals(m));


输出结果为(jdk1.7):

truetruefalsetruefalsetruetruetruetrue

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

也就是说变量 a和b指向同一个对象,因为值小于127,所以a==b为true;c和d表示的值超过了127,因此会分别创建一个新的对象,所以c==d为false;对于变量e和f,尽管二者的内容小于127,但是由于这两个对象都是使用new产生出来的,不适用于自动装箱boxing的缓存规则,因此e==f为false。而当一个封装类型与基本类型比较时,封装类型会自动拆箱成基本类型,因此 e==m和a==m均为true。


最后摘抄一段来自第三个链接的结论(原文来自 xelz' blog ,链接地址:http://www.cnblogs.com/mingcn/archive/2010/10/20/JavaAutoBoxing.html)


对于值相等的两个“对象”,如果有一个是基本数据类型,则"=="总恒为true(这里其实是将包装类型UnBoxing)

如果两个都是包装类型,则

如果有一个是通过new创建出来的,"=="为false(分配了新的空间)

否则(即都不是通过new创建,AutoBoxing的结果)

如果该值是boolean/byte/float/double类型之一

或者char/short/int/long类型之一并且值范围在-127 ~ 128之间,==为true,否则==为false



0 0
原创粉丝点击