Java-自动拆装箱

1.什么是拆装箱
装箱就是将原始类型值转换成对应的对象,拆箱就与之相反。
这里再复习下Java中的数据类型
这里写图片描述

装箱的基本数据类型和对应的封装类如下:

int——Integer——4Byte
short——Short——2Byte
long——Long——8Byte
float——Float——4byte
double——Double——8Byte
byte——Byte——1Byte
char——Character——2Byte
boolean——Boolean——1bit

2.为什么要拆装箱
装箱的目的主要是想让基本的数据类型也能使用对象的方法
例如再Java集合类中

List<Inteter> list=new ArrayList<Integer>();

Arraylist如果想放入整数只能放对象,就可以将int类型包装成一个类Integer,再放入到集合中。这样整数数组也可以使用ArrayList的各种方法了。

3.如何实现自动拆装箱
这是JavaSE 5.0开始提供的功能。可以自动的实现拆箱和装箱。

//手动装箱
int i=1;
Integer a=new Integer(i);
//自动装箱
Integer b=1;
Integer j=new Integer(8);
//手动拆箱
int m=j.intValue();
//自动拆箱
int n=j;

可以看出能够自动实现拆装箱可以让代码更加简洁
这个实现过程在编译成.class文件的过程就实现了,并不是JVM中实现的。

4.一些例子

public static void main(String[] args) {        
        //1
        Integer a=new Integer(123);
        Integer b=new Integer(123);
        System.out.println(a==b);//输出 false

        //2 
        Integer c=123;
        Integer d=123;  
        System.out.println(c==d);//输出 true

        //3
        Integer e=129;
        Integer f=129;
        System.out.println(e==f);//输出 false
        //4
        int g=59;
        Integer h=new Integer(59);
        System.out.println(g==h);//输出 true
    }

代码1好理解,因为新建了不同的对象。
代码2为什么返回true呢?原来自动装箱的源码简化如下:

public static Integer valueOf(int i) {       
        if (i >= -128 && i <= 127)
            return IntegerCache.cache[i + 127];
            //如果i的值大于-128小于127则返回一个缓冲区中的一个Integer对象
        return new Integer(i);
        //否则返回 new 一个Integer 对象
    }

这一点与Python类似,原来IntegerCache 类在初始化的时候,生成了一个大小为 256 的integer 类型的常量池,并且integer.val 的值从-128-127,当我们运行 Integer c=a ;时,如果 -128<=a<=127时,不会再生成新的integer对象,直接从常量池中找到对应的已经初始化后的对象。当 a<-128||a>127时才会生成一个新的对象。所以代码3返回的也是false
值得注意的是代码4中,最后在比较g h 的值时,用了自动拆箱,g == h 这一代码执行的是:g==h.IntValue(),而h.IntValue()= 59 。所以实际上比较的是两个int类型,返回为true。

猜你喜欢

转载自blog.csdn.net/Yolandera/article/details/81181316