乐趣区

关于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 中的装箱和拆箱技术经验了从手动到主动、从一般到紧凑型的演进,这使得咱们可能更不便地操作根本数据类型和封装类型之间的转换。尽管更加不便, 然而在理论开发中,还是须要依据具体的应用场景进行抉择。

结尾

  如果感觉对你有帮忙,能够多多评论,多多点赞哦,也能够到我的主页看看,说不定有你喜爱的文章,也能够顺手点个关注哦,谢谢。

  我是不一样的科技宅,每天提高一点点,体验不一样的生存。咱们下期见!

退出移动版