Java基本类型的自动装箱与自动拆箱

Java基本类型的自动装箱与自动拆箱

一、简介

java是面入对象编程的语言,所有的都表示为对象。那么对于基本类型,java提供了对应的包装类。相应的就有自动装箱与自动拆箱操作。

二、自动装箱

2.1 定义

自动装箱是指基本类型转为对应的包装类,如int转Integer,double转为Double等。

2.2 转换方法

转换的方式是通过Integer.valueOf()、Double.valueOf()等方式(注意此时涉及到对应包装类的静态缓存问题)。

2.3 转换时机

当对包装类型的变量进行赋值或传值时,会进行自动装箱操作。特别注意,当对包装类变量进行多次运算(如循环)且值不在静态缓存内(-128到127内)时,这时会多次new相应的对象,会制造很多无用的对象实例。

2.4 在方法中传递包装类对象

此时传递的虽是对象引用,但由于经过运算修改后,方法内的变量(或者说是线程内的变量)是新建(new)的包装类,因此,方法外面的包装类变量,并不会随着方法内变量值的改变而改变。

三、自动拆箱

3.1 定义

自动拆箱是指将包装类转为基本类型,如Integer转为int、Double转为double等

3.2 转换方法

转换的方式是通过Integer.intValue()、Double.doubleValue();

3.3 转换时机

当进行算术运算或给基本类型赋值时,会进行拆箱操作。

四、代码实例

public class BaseTypeBoxingMain {
    public static void main(String[] args) {
        autoBoxing1(); //自动装箱例1 基本装箱操作
        autoBoxing2();  //自动装箱例2 会新建多个无用的对象
        unBoxing();  //自动拆箱示例

        System.out.println("====================包装类对象方法间传递====================");
        Integer i= 1;
        System.out.println("source i:"+i);
        changeValue(i);  //方法调用,试图修改值,结果是不成功的
        System.out.println("after invoke changeValue , i:"+i);
    }

    //自动装箱例1
    static void autoBoxing1() {
        System.out.println("======================自动装箱例1===========================");
        Integer i1 = 1;    //Integer.valueOf()   缓存取
        Integer i2 = 1;    //Integer.valueOf()   缓存取
        System.out.println(i1 == i2);

        Integer i5 = 222;    //Integer.valueOf()  new
        Integer i6 = 222;    //Integer.valueOf()  new
        System.out.println(i5 == i6);

        Double d1 = 1d;   //Double.valueOf()  new
        Double d2 = 1d;   //Double.valueOf()  new
        System.out.println(d1 == d2);

        Double d3 = 222d;   //Double.valueOf()  new
        Double d4 = 222d;   //Double.valueOf()  new
        System.out.println(d3 == d4);

    }

    //自动装箱例2
    static void autoBoxing2() {
        System.out.println("======================自动装箱例2===========================");
        Integer cnt = 1;
        for (int i = 200; i < 203; i++) {  //此时会创建3个新的Integer实例
            cnt += 1;
            System.out.println(System.identityHashCode(cnt));  //hashcode不一样,也就是存储地址不一样,也就说不是同一个对象
        }
    }

    //自动拆箱
    static void unBoxing() {
        System.out.println("======================自动拆箱示例===========================");
        Integer i1 = 1;
        int i2 = i1;   //基本类型赋值  i2=i1.intValue()
        System.out.println(i2);

        int i3 = i1 + 1;  // 基本类型进行运算  i3=i1.intValue()+1
        System.out.println(i3);
    }

    static void changeValue(Integer val) {
        val = 2;
        System.out.println("in changeValue ,i:"+val);
    }
}

运行结果:

======================自动装箱例1===========================
true
false
false
false
======================自动装箱例2===========================
1625635731
1580066828
491044090
======================自动拆箱示例===========================
1
2
====================包装类对象方法间传递====================
source i:1
in changeValue ,i:2
after invoke changeValue , i:1
发布了274 篇原创文章 · 获赞 95 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/chinabestchina/article/details/105189032
今日推荐