一文探寻Java装箱和拆箱的奥妙

 更新时间:2023年04月26日 10:59:44   作者:不一样的科技宅  
Java中的装箱(boxing)和拆箱(unboxing)是指将基本数据类型与其对应的包装类之间进行转换的过程。本文就来带大家探索一下Java装箱和拆箱的奥妙吧

前言

今天在逛某知名论坛的时候,看到一篇"请不要使用包装类型,避免造成性能损失"的文章。一下子就吸引了我的注意。大意就是,能用基本数据类型就尽量用基本数据类型,因为包装类型自动拆箱、装箱会带来性能损失尤其是循环使用时会大量创建对象。所以今天聊一下,Java的装箱和拆箱。

什么是装箱和拆箱

Java中的装箱(boxing)和拆箱(unboxing)是指将基本数据类型与其对应的包装类之间进行转换的过程。

装箱

装箱是将基本数据类型转换为其对应的包装类,例如将int类型转换为Integer类型。这个过程是通过自动装箱(autoboxing)或手动装箱(manual boxing)完成的。自动装箱是指Java编译器自动将基本类型转换为包装类型,而手动装箱则是通过调用包装类的构造函数来完成。

拆箱

拆箱是将包装类转换为其对应的基本数据类型,例如将Integer类型转换为int类型。这个过程也是通过自动拆箱(autounboxing)或手动拆箱(manual unboxing)完成的。自动拆箱是指Java编译器自动将包装类型转换为基本类型,而手动拆箱则是通过调用包装类的xxxValue()方法来完成。

为啥要包装类型

在日常使用的时候,感觉用基本类型还是包装类型貌似没啥区别。如果去掉包装类型,那就不需要装箱和拆箱了。也就避免了性能损失。貌似很完美呀。

如果你是这样想就,大错特错了。java中有基本数据类型和包装类型,这是为了满足不同需求的设计。java大佬们肯定不会做这样的无用功的,使用包装类型的主要原因包括:

  • 对象引用:基本类型不是对象,无法使用对象引用,而包装类型是对象,可以通过引用来操作。
  • 泛型:泛型不能使用基本数据类型,必须使用包装类型。如,使用List<Integer>来存储一组整数,而不是使用List<int>
  • null值:基本类型不能为null,而包装类型可以为null。
  • 类型转换:包装类型提供了许多类型转换方法,例如将字符串转换为整数或浮点数等,这些方法非常方便。
  • 方法重载:方法重载可以使用不同的参数类型,但是基本数据类型和其对应的包装类型在方法中被认为是不相同的类型,因此可以在方法中使用它们进行重载。

尽管基本数据类型在Java中非常有用,但是包装类型提供了更多的功能和灵活性,因此在某些情况下使用包装类型会更为方便和实用。所以就有了装箱和拆箱的过程。

装箱和拆箱的进化过程

在Java 1.4及之前,装箱和拆箱需要手动进行,即需要使用对应的构造函数或方法来完成。例如,要将int类型的变量x装箱成Integer类型,可以使用以下代码:

int x = 10;
Integer y = new Integer(x);  // 手动装箱

要将Integer类型的变量y拆箱成int类型,可以使用以下代码:

Integer y = new Integer(10);
int x = y.intValue();  // 手动拆箱

这种方式比较繁琐,也容易出错。因此,从Java 5开始,引入了自动装箱和拆箱机制。这意味着我们可以直接将基本数据类型赋值给对应的封装类型变量,或将封装类型变量赋值给对应的基本数据类型变量,编译器会自动完成转换。例如:

int x = 10;
Integer y = x;  // 自动装箱
int z = y;  // 自动拆箱

从Java 9开始,引入了一种新的装箱方式,称为“紧凑型装箱”(Compact Number Box),它能够更高效地存储小范围内的数值。紧凑型装箱只适用于byte、short和int类型的封装类型,这些类型的取值范围都比较小(如byte的取值范围为-128到127),因此可以使用一个byte或short类型的变量来存储它们的值,而无需使用一个整型变量。

到底该如何选择呢

基本类型是Java语言的基础,可以直接存储在栈中,具有较高的执行效率和较小的内存占用。包装类型是把基本类型封装起来的对象,可以在堆中存储,可以进行各种面向对象的操作。所以在选择使用基本类型还是包装类型时,可以考虑以下几个因素:

  • 执行效率:基本类型具有较高的执行效率,尤其是在大量计算的情况下,使用基本类型可以明显提高程序的执行速度。
  • 内存占用:基本类型在栈中存储,占用的内存较小,而包装类型在堆中存储,占用的内存较大。
  • 对象操作:如果需要进行面向对象的操作,例如通过equals()方法比较两个变量的值,或者将基本类型转换为字符串,就需要使用包装类型。
  • 空值处理:基本类型不能表示空值,而包装类型可以用null表示空值,因此在需要处理空值的情况下,需要使用包装类型。

总结

Java中的装箱和拆箱技术经历了从手动到自动、从普通到紧凑型的演进,这使得我们能够更方便地操作基本数据类型和封装类型之间的转换。虽然更加方便, 但是在实际开发中,还是需要根据具体的使用场景进行选择。

到此这篇关于一文探寻Java装箱和拆箱的奥妙的文章就介绍到这了,更多相关Java装箱 拆箱内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中使用spring-retry 解决失败重试调用

    SpringBoot中使用spring-retry 解决失败重试调用

    本文主要介绍了SpringBoot中使用spring-retry 解决失败重试调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java实现字符串和输入流的相互转换

    Java实现字符串和输入流的相互转换

    这篇文章主要介绍了Java实现字符串和输入流的相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • SpringBoot自动装配原理详解

    SpringBoot自动装配原理详解

    这篇文章主要介绍了SpringBoot自动装配原理的相关资料,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-03-03
  • MyBatis-Plus Sequence主键的实现

    MyBatis-Plus Sequence主键的实现

    这篇文章主要介绍了MyBatis-Plus Sequence主键的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 4种java复制文件的方式

    4种java复制文件的方式

    本篇文章列举了4种最受欢迎的java复制文件的方式,复制文件是一个重要的操作,需要的朋友可以参考下
    2015-07-07
  • Java匿名内部类原理与用法详解

    Java匿名内部类原理与用法详解

    这篇文章主要介绍了Java匿名内部类原理与用法,结合实例形式分析了Java匿名内部类的概念、原理、应用与相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java 线程相关总结

    Java 线程相关总结

    这篇文章主要介绍了Java 线程的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • Java实现生成二维码展示到浏览器的示例代码

    Java实现生成二维码展示到浏览器的示例代码

    这篇文章主要介绍了Java实现生成二维码展示到浏览器的示例代码,要实现在浏览器展示二维码,那么首先需要html文件,通过Java生成二维码的工具类,在controller层调用接口,就可以实现在浏览器上展示二维码,需要的朋友可以参考下
    2024-01-01
  • MP(MyBatis-Plus)实现乐观锁更新功能的示例代码

    MP(MyBatis-Plus)实现乐观锁更新功能的示例代码

    这篇文章主要介绍了MP(MyBatis-Plus)实现乐观锁更新功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java设计模式之单例模式Singleton Pattern详解

    Java设计模式之单例模式Singleton Pattern详解

    这篇文章主要介绍了Java设计模式之单例模式Singleton Pattern详解,一些常用的工具类、线程池、缓存,数据库,数据库连接池、账户登录系统、配置文件等程序中可能只允许我们创建一个对象,这就需要单例模式,需要的朋友可以参考下
    2023-12-12

最新评论