Java自动装箱与自动拆箱

1.什么是自动装箱与自动拆箱

自动装箱是指Java将基本数据类型转换为对应的引用数据类型,如将int转换为Integer类型;反之将引用数据类型转换为基本数据类型的操作叫自动拆箱。因为这里的拆箱与装箱都不是Java不是人为的,所以加上自动二字。

Integer a = 1;        //自动装箱
int b = a;            //自动拆箱

2.自动拆箱与自动装箱的实现过程

自动装箱过程通过调用包装器的valueOf()方法实现的,如

Integer a = Integer.valueOf(1);

   自动拆箱过程通过调用包装器的xxxValue()方法实现的,xxx对应的基本数据类型,如

Integer a = 10;
int b = a.intValue();

3.Integer a = 1 和 Integer a = new Integer(1)之间的区别

   (1)第一种方法会触发自动装箱过程,而第二种方法不会触发自动装箱过程;

   (2)第一种方法的执行效率和资源占用在一般情况下要优于第二种情况;

4.对象相等比较

Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
Integer d = new Integer(1);
Integer e = 200;
Integer f = 200;
System.out.println(a == b);     //true
System.out.println(c == d);     //false
System.out.println(e == f);     //false

对于a与b,e与f之间的比较,都会触发自动装箱过程,而JVM处于节省内存的考虑,会缓存-128到127之间的Integer对象,所以a和b实际上是同一对象,返回为true,而e和f大于127,为两个对象,返回为false。

对于c和d,他们不会触发自动装箱过程,直接返回两个对象,返回结果为false。

Integer a = 1;
Integer b = 2;
Integer c = 3;
Long d = 3L;
Long e = 2L;

System.out.println(c == (a+b));         //true
System.out.println(c.equals(a+b));      //true
System.out.println(d == (a+b));         //true
System.out.println(d.equals(a+b));      //false
System.out.println(d.equals(a+e));      //true

注意:

     (1)若“==”两边都是引用数据类型,则会比较两边是否为同一对象,但若一边是表达式(进行算术运算),则会触发自动拆箱过程,最后比较的是两边的数值;

     (2)对于引用数据类型,equals()方法不会进行类型转换,若引用数据类型相同,则会比较他们的值;

所以:

第一个会触发自动拆箱,比较值,结果为true;第二个数据类型相同,值也相同,也返回true;第三个虽然左右两边的类型不同,但因为有表达式,触发自动拆箱过程,返回结果为true;第四个中,d的类型为Long,(a+b)的类型为Integer,类型不一样,返回为false;第五个,(a+e)会自动类型转换,结果类型为Long,值与d也一样,返回为true。

猜你喜欢

转载自blog.csdn.net/zai_xia/article/details/81637389