文章目录

  • 1. 引入
  • 2. 装箱和拆箱
  • 3. 基本数据类型和包装类的区别:
  • 4. 参考

1. 引入

图形化理解Java中的形参和实参中,我们知道Java中八大基本数据类型,同样也知道了它们各自的取值范围和默认的初始值。那么,既然已经有基本数据类型使用,为什么还要使用包装类呢?Java是一门面向对象的编程语言,而基本数据类型并不具备面向对象的特点,因此包装类的引入是为了让基本类型具有对象的特点;另一方面包装类也方便了泛型的使用

例如:如果希望向ArrayList当中存储基本数据类型,必须使用基本数据类型对应的包装类:

基本数据类型

默认值

包装类

默认值

byte

0

Byte

null

short

0

Short

null

int

0

Integer

null

long

0

Long

null

float

0.0

Float

null

double

0.0

Double

null

char


Character

null

boolean

false

Boolean

null

例如,Integer在ArrayList中的使用如下所示:

public class Test{
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);
        System.out.println(list);

        for(Integer ele : list) {
            System.out.println(ele);
        }
    }
}

2. 装箱和拆箱

装箱和拆箱表示的是 基本数据类型和包装类型之间的相互转换。其中:

  • 装箱:指基本类型到包装类型的转换
  • 构造方法,以Integer为例,主要有如下两个构造方法:
  • Integer(int value):构造新的Integer对象用于表示指定的int值,已过时
  • Integer(String s):构造新的Integer对象用于表示指定的同String表示int值,已过时
  • 静态方法:
  • static Integer valueOf(int i)
  • static Integer valueOf(String s)
  • 拆箱:指包装类型到基本数据类型的转换
  • int intValue()
  • 其他类型原理类似
public class Test{
    public static void main(String[] args) {
        // 构造方法
        Integer i = new Integer(24);
        System.out.println(i);  // 24

        Integer i1 = new Integer("24");
        System.out.println(i1);  // 24

        // 静态方法
        Integer i2 = Integer.valueOf(24);
        Integer i3 = Integer.valueOf("24");
        System.out.println(i2); // 24
        System.out.println(i3); // 24
        
        // 拆箱
        int number= i.intValue();
        System.out.println(number);  // 24
    }
}

基本数据类型和包装类之间的自动转换就称为自动装箱自动拆箱

  • 自动装箱基本类型 -> 包装类型
public class Test {
    public static void main(String[] args) {
        // 自动装箱
        int number = 8;
        Integer x = new Integer(number);
        System.out.println(x);  // 8
        System.out.println(x.getClass());  // class java.lang.Integer
    }
}

如上所示,我们首先定义一个int型的变量并赋值8,然后new一个Integer对象并将number传入。通过输出可以看出:x的值和number的值相等,并且此时x的类就是int对应的包装类Integer。其他基本类型数据到对应包装类的转换同理,都可以通过自动装箱实现。

  • 自动拆箱包装类型 -> 基本类型
public class Test {
    public static void main(String[] args) {
        // 自动拆箱
        Integer y = new Integer(24);
        System.out.println(y);
        System.out.println(y.getClass());
        int n = y;
        System.out.println(n);

    }
}

自动拆箱流程和上面的自动装箱相逆,即将包装类转换为对应的基本数据类型。

以Integer为例,自动装箱机制是调用了Integer的valueOf()实现:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

而自动拆箱调用intValue()方法实现:

public int intValue() {
    return value;
}


3. 基本数据类型和包装类的区别:

  • 基本类型不能使用new关键字来创建,而包装类作为类处理,那么包装类型必须使用new关键字来创建
  • 存储的位置不同,基本类型存储在栈区,包装类型存储在堆区
  • 初始值不同。基本类型中的int初始值为0,boolean初始值为false;包装类型初始值都为null

因此在进行自动装拆箱时一定要避免空指针异常

  • 使用场景不同,基本类型主要用于计算和赋值,包装类型用于泛型
  • 基本类型是值传递,包装类型是引用传递

4. 参考

Java基本数据类型及其包装类型