谈谈Java (1):自动装箱和自动拆箱

1,367 阅读3分钟

一、概念

简单的说:

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

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

例如:

Integer i = 10;  //装箱
int n = i;   //拆箱

二、基本包装类引入

2.1 基本类型包装类的产生

在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的。而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型,考试成绩需要转换成double类型等

概述:将基本的数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据

常见操作之一:用于基本数据类型与字符串之间的转换

img

2.2 包装类的常用方法

2.2.1 Integer 类其他方法
  • 十进制转成二进制 toBinarString(int)

  • 十进制转成八进制 toOctalString(int)

  • 十进制转成十六进制 toHexString(int)

【注意】:三个方法,返回值都是以String 形式出现

public static void function_1(){
	System.out.println(Integer.toBinaryString(99));
    System.out.println(Integer.toOctalString(99));
	System.out.println(Integer.toHexString(999));
}
2.2.2 Integer 类的构造方法
  • public Integer( int value)

  • public Integer ( String s): 注意:这个字符串由数字组成

public class Demo2 {
    public static void main(String[] args) {
        //方式1:
       int i=10;
       Integer ii =new Integer(10);
        System.out.println(ii);
 
        //方式2:
        String s= "111";//
        Integer iii =new Integer(s);
        System.out.println(iii);
    }
}
2.2.3 int 类型 和String类型的相互转换
public class Democrat {
    public static void main(String[] args) {
        //int -->String
        int number =100;
 
        //方式1:字符串拼接
        String s1=""+number;
        System.out.println(s1);
 
        //推荐方式2
        //方式2:String的方法:可以把任意类型的转换成字符串
        String s2 =String.valueOf(number);
        System.out.println("s2 = " + s2);
 
        //方式3
        Integer i= new Integer(number);
        System.out.println(i.toString());
 
        //方式4:
        String s4=Integer.toString(number);
        System.out.println(s4);
        System.out.println("-------------------------------");
 
        //String -->int
        String s="100";
        //方式1:
        //String--Integer---int
        Integer ii =new Integer(s);//把String类型转成Integer类型
        int x=ii.intValue();//把Integer类型转成int类型
        System.out.println(x);
 
        //方式2:很重要,同理,类似float
        //public static int parseInt(String s)
        int y=Integer.parseInt(s);
        System.out.println(y);
      
    }
}

三、装箱和拆箱的原理

装箱过程是通过调用 包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。

自动装箱,拆箱的 好处: 基本类型和引用类直接运算

【注意】:建议判断是否为null,然后再使用

自动装箱:

  • 使用Integer.valueOf(整数值)返回一个封装了该整数值的Integer对象
  • 即把基本类型转为引用类型

自动拆箱:

  • 使用 Integer 对象 .intValue()返回 Integer 对象中封装的整数值
  • 把引用类型转为基本数据类型

四、 几个题目

1、进行比较前会自动拆箱

class AutoUnboxingTest {
 
    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;                  // 将3自动装箱成Integer类型
        int c = 3;
        System.out.println(a == b);     // false 两个引用没有引用同一对象
        System.out.println(a == c);     // true a自动拆箱成int类型再和c比较
    }
}

2、输出的结果是什么?

public class Test03 {
 
    public static void main(String[] args) {
        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
 
        System.out.println(f1 == f2);
        System.out.println(f3 == f4);
    }
}

这四个变量都是 Integer 对象引用,所以下面的 == 运算比较的不是值而是引用。装箱的本质是什么呢?当我们给一个 Integer 对象赋一个 int 值的时候,会调用 Integer 类的静态方法 valueOf。所以整形字面量的值 在 -128 到127 之间,那么不会new 新的Integer 对象,而是直接引用常量池中的 Integer 对象,所以本题中

f1==f2 的true ;f3==f4 的值是false。