当前位置: 首页 > 面试题库 >

Java自动装箱/拆箱如何工作?

谢俊力
2023-03-14
问题内容

从JDK 5.0开始,自动装箱/拆箱是在Java中引入的,这种技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中的工作原理:

Boxing

int intValue = 0;
Integer intObject = intValue;
byte byteValue = 0;
intObject = byteValue; // ==> Error

尝试不同的情况下后(short,long,float,double),这是由编译器所接受的唯一情况是,当值的上做作运算符右侧的类型是int。当我查看源代码时,Integer.class发现它仅实现一个带int参数的构造函数。

因此,我的结论是,自动装箱的概念基于在包装类中实现的构造函数。我想知道这个结论是否正确,还是自动装箱使用了另一个概念?

Unboxing

Integer intObject = new Integer(0);
byte byteValue = intObject; // ==> Error (the same Error with short)
int intValue = intObject; 
double doubleValue = intObject;

我关于拆箱的结论是,包装器类提供了对象以相应类型(Integer==> int)包装的值,然后编译器使用转换原始类型的常规规则(byte=> short=> int=> long=> float=> double)。我想知道这个结论是否正确,还是自动拆箱使用了另一个概念?

谢谢你的进阶:)


问题答案:

如有疑问,请检查字节码:

Integer n = 42;

变成:

0: bipush        42
2: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1   

因此,实际上,它valueOf()是与构造函数相对使用的(其他包装类也是如此)。这是有益的,因为它允许缓存,并且不会在每次装箱操作时强制创建新对象。

反之则如下:

int n = Integer.valueOf(42);

变成:

0: bipush        42
2: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: invokevirtual #22                 // Method java/lang/Integer.intValue:()I
8: istore_1  

intValue()使用(同样,它也与其他包装类型类似)。这实际上是所有自动装箱归结为。

你可以分别在JLS§5.1.7和JLS§5.1.8中了解装箱和拆箱转换。



 类似资料:
  • 本文向大家介绍自动装箱和拆箱?相关面试题,主要包含被问及自动装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 自动装箱是Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。 比如:把int转化成 Integer,double转化成 Double,等等。反之就是自动拆箱。 原始类型: boolean,char,byte,short,int,long,float,double 

  • 自JDK5.0以来,Java引入了自动装箱/取消装箱。这个技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java是如何工作的。例如: 拳击 在尝试了不同的情况(、、、)后,编译器接受的唯一情况是做作运算符右侧值的类型为。当我查看的源代码时,我发现它只实现了一个带有参数的构造函数。 所以我的结论是自动装箱的概念是基于在包装类中实现的构造函数。

  • 主要内容:装箱和拆箱,包装类的应用在 Java 的设计中提倡一种思想,即一切皆对象。但是从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?于是 Java 为每种基本数据类型分别设计了对应的类,称之为 包装类(Wrapper Classes),也有地方称为外覆类或数据类型类。 包装类和基本数据类型的关系如下表所示。 基本数据类型及对应的包装类 序号 基本数据类型

  • 本文向大家介绍Java中自动装箱、拆箱引起的耗时详解,包括了Java中自动装箱、拆箱引起的耗时详解的使用技巧和注意事项,需要的朋友参考一下 什么是自动装箱,拆箱 先抛出定义,Java中基础数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程对程序员是透明的,这就是装箱和拆箱,装箱和拆箱可以让我们的代码更简洁易懂 耗时问题 在说 Java 的自动装箱和自动拆箱之前,我们先看一个例子

  • 问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使

  • 问题内容: 以下代码进行编译(使用Java 8): 但是它是做什么的呢? 取消装箱: 或盒子: 那么它是比较两个对象(按引用)还是按值比较两个变量? 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类会维护一个介于to 之间的值的内部缓存(另请参见TheLostMind的注释)。这就是我在示例中使用的原因,也是为什么我特别询问拆箱/装箱而不是比较结果的原因。 问题答案: 它在JL