黑马程序员技术交流社区

标题: 请问 自动装箱和拆箱到底是什么意思呀 [打印本页]

作者: wangyuyus    时间: 2013-11-17 13:05
标题: 请问 自动装箱和拆箱到底是什么意思呀
public class test3 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Integer i1 =137;//自动装箱成整形对象

                Integer i2 =137;//自动装箱成整形对象
               
                System.out.println( i1==i2);//打印出false
                /*137大于127,所以i1和i2指向了两个不同的堆内存对象。地址不相等,打印false*/
                       

                i1 =13;

                i2 =13;
               
                System.out.println( i1==i2); //打印出true
                /*”13“被封装成对象并存放在常量池中,i1和i2都指向了常量池里同一个对象,地址相同,打印true*/
        }

}


作者: 零下五度的水    时间: 2013-11-17 13:19
把 Integer 自动转成 int 就是自动拆箱,反过来就是自动拆箱
作者: 陈文杰    时间: 2013-11-17 13:25
这个问题我们也把equal引进来,一次性解决,深入了解一下吧。
Integer m = 128; Integer n = 128;
   Integer a = 127;  Integer b = 127;


m.equal(n) 以及a.equal(b)显然是结果是相等的 。equal比较的是两个对象的内容是否相等。 上面是JDK1.5的新特性,叫自动装包和拆包。
所以上面自动封装成Integer对象。 它们两个对象的内容相同 所以显示相等

但m==n的结果是不相等的。
==比较的是内存地址。i1,i2自动装包成Integer类,由于它们的内存地址是不同的,所以显示不相等。

但a==b 结果是相等的。显然比较的内容相等。

为什么m==n 判断为false,但a==b 却判断为true呢,原因是什么?
由于自动装包,它们其实都是装在一个Integer对象中。
这里就有特殊性质了。ava编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
作者: 凝聚    时间: 2013-11-17 13:36
基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。

一般我们要创建一个类的对象的时候,我们会这样:

Class a = new Class(parameter);

        当我们创建一个Integer对象时,却可以这样:

Integer i = 100; (注意:不是 int i = 100; )

实际上,执行上面那句代码的时候,系统为我们执行了:Integer i = new Integer(100); 此即基本数据类型的自动装箱功能。
自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出。如下可实现自动拆箱:
1 Integer i = 10;        //装箱  
2   int t = i;             //拆箱






  在进行运算时,也可以进行自动装箱与拆箱。

1 Integer i = 10;   
2 System.out.println(i++);



??Integer的自动装箱
复制代码
//在-128~127 之外的数
Integer i1 = 200;  
Integer i2 = 200;         
System.out.println("i1==i2: "+(i1==i2));                  
// 在-128~127 之内的数
Integer i3 = 100;  
Integer i4 = 100;  
System.out.println("i3==i4: "+(i3==i4));


复制代码




          输出的结果是:
    i1==i2: false
    i3==i4: true





作者: hel    时间: 2013-11-17 13:58
本帖最后由 hel 于 2013-11-17 14:02 编辑

Integer i1 =137;//自动装箱成整形对象

以前要这样写
integer i1 = new Integer(137);
先将基本数据类型137包装称Integer类型

现在不用了直接就是 Integer i1 =137;






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2