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

作者:不一样的科技宅 时间:2022-08-15 21:41:21 

前言

今天在逛某知名论坛的时候,看到一篇"请不要使用包装类型,避免造成性能损失"的文章。一下子就吸引了我的注意。大意就是,能用基本数据类型就尽量用基本数据类型,因为包装类型自动拆箱、装箱会带来性能损失尤其是循环使用时会大量创建对象。所以今天聊一下,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开始,引入了一种新的装箱方式,称为&ldquo;紧凑型装箱&rdquo;(Compact Number Box),它能够更高效地存储小范围内的数值。紧凑型装箱只适用于byte、short和int类型的封装类型,这些类型的取值范围都比较小(如byte的取值范围为-128到127),因此可以使用一个byte或short类型的变量来存储它们的值,而无需使用一个整型变量。

到底该如何选择呢

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

  • 执行效率:基本类型具有较高的执行效率,尤其是在大量计算的情况下,使用基本类型可以明显提高程序的执行速度。

  • 内存占用:基本类型在栈中存储,占用的内存较小,而包装类型在堆中存储,占用的内存较大。

  • 对象操作:如果需要进行面向对象的操作,例如通过equals()方法比较两个变量的值,或者将基本类型转换为字符串,就需要使用包装类型。

  • 空值处理:基本类型不能表示空值,而包装类型可以用null表示空值,因此在需要处理空值的情况下,需要使用包装类型。

来源:https://juejin.cn/post/7225552757608251449

标签:Java,装箱,拆箱
0
投稿

猜你喜欢

  • 基于Map的computeIfAbsent的使用场景和使用方式

    2023-04-30 03:04:06
  • 普通对象使用spring容器中的对象的实现方法

    2023-06-17 12:27:20
  • 关于Jsoup将相对路径转为绝对路径的方法

    2022-03-11 04:13:50
  • 一文总结Java获取文件后缀名的所有方法

    2022-10-18 16:06:40
  • 详细解读Hibernate的缓存机制

    2023-05-03 21:02:52
  • mybatis-plus配置控制台打印完整带参数SQL语句的实现

    2023-11-24 22:43:58
  • Java Code Cache满导致应用性能降低问题解决

    2021-06-18 18:17:56
  • SpringBoot 利用thymeleaf自定义错误页面

    2023-11-29 08:29:55
  • java连接MySQl数据库实例代码

    2021-12-18 18:19:36
  • java编程下字符串的16位,32位md5加密实现方法

    2023-07-29 21:34:28
  • JavaMap两种遍历方式keySet与entrySet详解

    2022-04-17 14:36:29
  • Spring Security实现用户名密码登录详解

    2021-05-24 14:32:36
  • android分享纯图片到QQ空间实现方式

    2023-07-20 10:56:03
  • Java 数据结构与算法系列精讲之排序算法

    2023-11-01 13:25:40
  • Java Scala实现数据库增删查改操作详解

    2022-02-03 05:09:22
  • java自定义ClassLoader加载指定的class文件操作

    2022-03-16 16:19:07
  • Java Socket使用加密协议进行传输对象的方法

    2023-11-28 12:47:44
  • Java源码解析之object类

    2023-11-05 00:46:28
  • SpringBoot2整合Ehcache组件实现轻量级缓存管理

    2022-06-18 18:11:16
  • java LRU(Least Recently Used )详解及实例代码

    2022-10-08 10:42:43
  • asp之家 软件编程 m.aspxhome.com