(自动拆箱与装箱)

先进行专栏介绍

本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记 进行适当修改。希望能对大家能有所帮助,同时也是请大家对我进行监督,对我写的代码进行建议,互相学习。 在这里插入图片描述

自动拆箱与装箱是Java语言中一个重要的特性,它们在编程过程中起着至关重要的作用。本文将深入探讨自动拆箱与装箱的原理和相关细节。

概念

基本概念

装箱:把基本数据类型转换为对应的包装类类型 拆箱:把包装类类型转换为对应的基本数据类型

分析

在Java中,基本数据类型(如int、char、boolean等)是非对象的,而引用数据类型(如Integer、Character、Boolean等)是对象。拆箱是将包装类型对象转换为基本数据类型的过程,而装箱则是将基本数据类型转换为包装类型对象的过程。自动拆箱与装箱是指在需要的时候,Java编译器会自动地进行这些转换,使得我们在编程过程中更加方便地使用基本数据类型和引用数据类型。 在这里插入图片描述

原理

自动拆箱的原理

通过调用包装类型对象的xxxValue()方法将其转换为相应的基本数据类型。例如,当我们将一个Integer对象赋值给一个int类型的变量时,编译器会自动调用Integer对象的intValue()方法,将其转换为int类型。这样,我们就可以直接使用基本数据类型进行运算和比较,而无需手动进行类型转换。

自动装箱的原理

通过调用包装类型的valueOf()方法将基本数据类型转换为包装类型对象。例如,当我们将一个int类型的变量赋值给一个Integer对象时,编译器会自动调用Integer类的valueOf()方法,将int类型转换为Integer对象。这样,我们就可以将基本数据类型作为对象进行操作,享受到对象的各种方法和特性。

总结

自动装箱和拆箱的原理是由Java编译器在编译时进行处理的,编译器会根据上下文自动插入装箱和拆箱的代码,使得程序员可以直接使用基本类型和包装类型,而不需要手动进行类型转换。这种机制可以简化代码的编写,提高代码的可读性和可维护性。此外,自动拆箱与装箱还有助于避免一些常见的编程错误,如类型不匹配等。 在这里插入图片描述

注意事项

1、性能损耗:自动装箱和拆箱会引入额外的性能损耗,因为需要进行对象的创建和销毁。在性能敏感的场景下,尽量避免频繁的装箱和拆箱操作。

2、空指针异常:在拆箱操作时,如果装箱对象为null,则会抛出空指针异常。因此,在进行拆箱操作之前,需要先进行null的判断。

3、对象比较:自动装箱会导致对象的创建,因此在比较两个装箱类型的值时,应使用equals()方法进行比较,而不是使用 == 运算符。因为 == 运算符比较的是对象的引用,而不是对象的值。

4、缓存对象:在装箱操作时,Java对于某些范围内的整数和字符类型进行了缓存,可以直接使用缓存对象,而不需要创建新的对象。例如,对于整数类型,范围在-128到127之间的整数会被缓存,可以直接使用Integer.valueOf()方法获取缓存对象。

5、不可变性:包装类型是不可变的,即一旦创建,其值不能被修改。如果需要修改值,需要创建一个新的包装对象。

代码示例

public class crj {
    public static void main(String[] args) {
        //装箱
//        Integer i=Integer.valueOf(100);
        //自动装箱
        Integer ii = 100;
        //自动拆箱
        ii+=200;  //ii==ii.intValue()+200
        System.out.println(ii);
    }
}