Java的自动装箱(autoboxing)和拆箱(unboxing)

java作为面向对象语言,有人认为所看到的都是对象,事实上,在javase5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在javase5之后,为基本数据类型提供了自动装箱和拆箱功能,使得将基本类型转换为对象变得极其便捷。

基本类型:

byte字节型(一个字节),char字符型(两个字节),short短整型(两个字节),int整型(四个字节), 
long长整型(八个字节),float浮点型(四个字节),double 双精度浮点型(八个字节),boolean型(一个字节)

在javase5之前,如果想要把基本数据类型作为对象来操作,就需要采用对应的对象,来把它们打包才行。

手动打包示例

Long,Integer,Double,Float,Boolean等等的类就是所谓的wrapper类,就跟wrapper这个单词所代表的意思一样,就是提供一个“包装,加壳”,把基本数据类型放在里面,来看代码,体会下先:

public class WrapperDemo{ 
    public staticvoid main(String[] args){ 
         int data1=21; 
         int data2=24; 
         //打包成为对象 
         Integer data1Wrapper = new Integer(data1); 
         Integer data2Wrapper = new Integer(data2); 
         //原始数据直接除以3 
         System.out.println(data1/3); 
         //将数据打包,转换为double型,除以3 
         System.out.println(data1Wrapper.doubleValue()/3); 
        //比较 
        System.out.println(data1Wrapper.compareTo(data2Wrapper)); 
    } 
 
}
结果是:
7
7.0
-1

通过上面的代码和运行结果,看到了将基本数据类型打包成为对象带来的好处了吧,别着急,这还只是javase5之前的做法,在javase5之后就已经支持自动装箱和拆箱了

javase5之前,手动打包 
Integer data1 = new Integer(10); 

事先将基本类型数据转换为对象 
javase5之后,支持自动打包 
Integer data1 = 10; 
便可以实现将基本类型的数据转换为对象 
eg: 
    在上面的代码中,可以采用,可以直接进行两个基本数据类型的比较 
    data1.compareTo(data2); 
   基本数据类型本身没有什么方法,当你运行之后会发现,它仍然可以正确运行,这就自动装箱和拆箱带来的好处

自动装箱拆箱

自动装箱拆箱,其实是编译器帮了我们的忙,看一下下面的例子:

public class BoxDemo{ 
   public staticvoid main(String[] args){ 
    Integer data1 = 500; 
    Integer data2 = 500; 
    System.out.println(data1==data2); 
   } 
}

结果是false,自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,

如果超出了这个值的范围就不会被重用的,所以每次new出来的都是一个新的对象,结果自然会是false,如果将500改成100,结果就变成了true。

想深一步了解IntegerCache的话,可以参考API:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Integer.java#Integer.IntegerCache

你可能感兴趣的:(Java的自动装箱(autoboxing)和拆箱(unboxing))