Java自动装箱与自动拆箱

什么是自动装箱,自动拆箱

自动装箱就是自动将基本数据类型转换为包装器类型;
自动拆箱就是自动将包装器类型转换为基本数据类型。

基本数据类型

int、short、long、float、double、byte、char、boolean。

包装器类型

Integer、Byte、Long、Float、Double、Boolean、Character
Java自动装箱与自动拆箱_第1张图片

自动装箱代码

        // 定义基本类型a=3
        int a = 3;
        // b是Integer类定义的对象,直接用int类型的a赋值
        Integer b = a;
        // 3
        System.out.println(b);

自动拆箱代码

		// c是Integer类定义的对象
        Integer c = new Integer(3);
        // 定义基本类型d
        // int d = c,这段代码等价于:int a=b.intValue(),
        int d = c;
        // 3
        System.out.println(d);

测试

// 测试1
        Integer e = new Integer(123);
        Integer f = new Integer(123);
        System.out.println(e==f); // false
        System.out.println(e.equals(f)); // true

        // 测试2
        Integer g = 123;
        Integer h = 123;
        System.out.println(g==h); // ture

        // 测试3
        Integer l = 129;
        Integer m = 129;
        System.out.println(l==m); // false

        // 测试4
        Integer n = new Integer(129);
        int o = 129;
        System.out.println(o==n); // true
        System.out.println(n==o); // true

测试1好理解,e和f指向的是堆的两块不同的区域(不同的对象),所以他们是不相等的,e==f输出fasle,e.equals(f)比较的是值输出true。

测试2也好理解,他是一个自动装箱的过程,会调用Integer.valueOf ( int i ) 方法,所以,他们g,h都不会创建新的对象,而是直接从常量池中拿。所以他们都是一样的,输出true.
因为包装类,都会有一个缓存,通过valueOf就可以看见缓存的值的范围,
Integer的缓存范围是-128~127,所以当赋值的值在缓存中存在时,直接从 常量池中拿

测试3也是个自动装箱的过程,调用Integer.valueOf ( int i )方法,判断不在缓存中拿,129并不在缓存中,所以会在堆上创建新的对象,比较的时候当然是fasle.

测试4,int g=129,首先明白这个129是存储在哪里的?由于他是基本的数据类型,所以它是存在栈中的,Integer n=new Integer(129);这个会在堆中就创建一个对象存储的是129,但是由于代码执行到g==h的时候,这时一个是基本类型一个包装类型,他们相比较,n会发生自动拆箱的过程。即调用intValue()方法返回一个int类型,基本类型就是只比较数值,所以输出true。

注意

Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。Double、Float的valueOf方法的实现是类似的。
他们都有一个缓存的常量范围

总结

对于包装类的比较,如果是对值的最好选择用equals

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