【Integer】包装类型的自动拆装箱

1. 基本数据类型

JAVA 提供了两个类型系统:基本数据类型、引用类型。其中,基本数据类型是我们编程中使用最频繁的类型

Java 是一种强类型语言,第一次申明变量时,必须要指明数据类型。第一次为变量赋值称为变量的初始化

Java 基本类型共有八种,基本类型可以分为三类:

  • 字符类型:char
  • 布尔类型:boolean
  • 数值类型:byte、short、int、long、float、double

那么,使用基本数据类型有什么好处?

在 Java 语言中,new 一个对象存储在堆中,并通过栈内存的引用来使用此对象。对于我们经常操作的数据类型来说,每次创建对象,都会比较消耗资源。

而对于基本数据类型来说,其值是直接存储在栈内存中,不需要 new 对象。因此,基本数据类型操作起来更方便、高效。

2. 包装类型

Java 语言是一个面向对象的语言,但是 Java 中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)

8 大基本数据类型和其对应的包装类:

基本数据类型包装类(位于 java.lang 包中)
byteByte
shortShort
intInteger
floatFloat
longLong
doubleDouble
charCharacter
booleanBoolean

既然 Java 中为了提高效率,提供了八种基本数据类型,为什么还要提供包装类呢?

简单来说,就是让基本数据类型的变量具有类中对象的特征 ------ 有对应的方法来操作这些基本类型的数据

基本数据类型,虽然使用起来非常方便,但是没有对应的方法来操作这些基本类型的数据。而且,对于Java这种种面向对象语言来说,很多地方都需要使用对象而不是基本数据类型。如:集合类。因为,集合类中要求元素的数据类型是 Object 类型。那么,你是无法将 int、long 等基本数据类型放入其中的。

为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

3. 装箱与拆箱

基本类型与对应的包装类型对象之间,互相转换的过程称为“装箱”、“拆箱”

  • 装箱:从基本类型转换为对应的包装类对象
  • 拆箱:从包装类对象转换为对应的基本类型

以 int 与 Integer 为例:

基本类型 ==> 包装类对象

// 使用构造方法
Integer integer = new Integer(1);

// 使用 Integer.valueOf() 方法
Integer integer2 = Integer.valueOf(1)

包装类对象 ==> 基本类型

Integer integer = new Integer(1);
int num = integer.intValue();

4. 自动装箱与自动拆箱

在 Java SE5 中,为了减少开发人员的工作,Java 提供了自动拆箱与自动装箱功能

  • 自动装箱: 就是将基本数据类型自动转换成对应的包装类
  • 自动拆箱:就是将包装类自动转换成对应的基本数据类型
// 自动装箱
Integer integer = 6;

// 自动拆箱
int i = integer;

那么,自动装箱、自动拆箱功能到底是如何做到的呢?

如:

public static void main(String[] args) {
	// 自动装箱
    Integer integer = 6;
    // 自动拆箱
    int i = integer;
}

将此代码进行反编译后:

public static void main(String[] args) {
    Integer integer = Integer.valueOf(6);
    int i = integer.intValue();
}

发现:

  • int 类型数据自动装箱时:调用的是 Integer.valueOf() 方法
  • Integer 类型自动拆箱时:调用的是 Integer#intValue() 方法

那咋们再试试其它类型,如 long 类型:

public static void main(String[] args) {
    Integer integer = 6;
    int i = integer;

    Long l = 7L;
    long ll = l;
}

反编译后:

public static void main(String[] args) {
    Integer integer = Integer.valueOf(6);
    int i = integer.intValue();
    
    Long l = Long.valueOf(7L);
    long ll = l.longValue();
}

【总结】:对于 8 大包装类型而言,自动装箱就是调用 包装类.valueOf() 方法 ;自动拆箱就是调用 包装类对象.xxValue() 方法

5. 自动拆装箱的应用场景

场景一:将基本数据类型放入集合中

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);

反编译后:

List<Integer> list = new ArrayList();
// 自动装箱
list.add(Integer.valueOf(1));
list.add(Integer.valueOf(2));

当把基本数据类型放入集合中时,会将基本数据类型 自动装箱

场景二:将基本数据类型与包装类型进行运算

Integer integer = 1;
int i = 1 + integer;

反编译后:

Integer integer = Integer.valueOf(1);
int i = 1 + integer.intValue();

将基本数据类型与包装类型进行运算时,包装类型会进行 自动拆箱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值