探寻Java装箱和拆箱的奥妙!

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

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

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

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

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

总结

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

结尾

  如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。

  我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!

相关文章
|
1月前
|
Java 编译器
Java中的自动装箱和拆箱
Java中的自动装箱和拆箱
|
16天前
|
缓存 Java 编译器
Java自动装箱与拆箱(AutoBoxing_UnBoxing)
Java自动装箱与拆箱(AutoBoxing_UnBoxing)
23 4
|
22天前
|
Java 开发者
java自动装箱与拆箱
java自动装箱与拆箱
|
15天前
|
存储 缓存 Java
Java自动装箱和拆箱
Java自动装箱和拆箱
9 0
|
16天前
|
存储 人工智能 缓存
Java基础1-Java基本数据类型,以及自动拆装箱里隐藏的秘密(二)
Java基础1-Java基本数据类型,以及自动拆装箱里隐藏的秘密(二)
11 0
|
16天前
|
存储 缓存 Java
Java基础1-Java基本数据类型,以及自动拆装箱里隐藏的秘密(一)
Java基础1-Java基本数据类型,以及自动拆装箱里隐藏的秘密(一)
17 0
|
1月前
|
缓存 Java 计算机视觉
深入理解Java自动装箱和自动拆箱(反编译字节码理解每条指令)
在Java中,自动装箱(Autoboxing)是指将基本数据类型(如int、char等)自动转换为其对应的包装类(如Integer、Character等)的过程。而自动拆箱(Unboxing)则是将包装类的对象转换回其对应的基本数据类型的操作。这些特性从Java SE 5开始被引入,以方便开发者在处理基本类型和其包装类之间进行转换。 下面是一个简短的摘要: - **自动装箱**:当基本类型赋值给包装类时,例如 `Integer i = 1;`,Java会自动调用Integer的`valueOf()`方法,将int转换为Integer对象。对于数值在-128到127之间的int,会使用Int
55 2
深入理解Java自动装箱和自动拆箱(反编译字节码理解每条指令)
|
1月前
|
Java
【Java】一个关于装箱的某里面试题
【Java】一个关于装箱的某里面试题
11 1
|
1月前
|
Java 编译器 测试技术
滚雪球学Java(07):自动装箱、自动拆箱,Java开发者必备技能
【2月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
80 5
|
1月前
|
存储 缓存 Java
Java基本数据类型、包装类及拆装箱详解
Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据,而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述,并对自动拆箱和装箱的源码实现进行分析。
104 1
Java基本数据类型、包装类及拆装箱详解