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

将==用作基本值和装箱值时,是自动装箱还是拆箱

夏星阑
2023-03-14
问题内容

以下代码进行编译(使用Java 8):

Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);

但是它是做什么的呢?

取消装箱i1

boolean compared = (i1.intvalue() == i2);

或盒子i2

boolean compared = (i1 == new Integer(i2));

那么它是比较两个Integer对象(按引用)还是int按值比较两个变量?

请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类会维护一个介于-128to
之间的值的内部缓存127(另请参见TheLostMind的注释)。这就是我1000在示例中使用的原因,也是为什么我特别询问拆箱/装箱而不是比较结果的原因。


问题答案:

它在JLS#15.21.1中定义

如果相等运算符的操作数都是数字类型,或者一个是数字类型,而另一个是可转换(第5.1.8节)为数字类型,则对操作数(第5.6.2节)执行二进制数字提升。

和JLS#5.6.2:

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用:

  • 如果任何操作数是引用类型,则将其进行拆箱转换[…]

因此,为回答您的问题,将Integer拆箱到int



 类似资料:
  • 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护了到之间的值的内部缓存(另请参阅TheLostMind的注释)。这就是为什么我在示例中使用的原因,也是为什么我特别询问取消装箱/装箱而不是比较结果的原因。

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

  • 本文向大家介绍C#中什么是装箱和拆箱?相关面试题,主要包含被问及C#中什么是装箱和拆箱?时的应答技巧和注意事项,需要的朋友参考一下 答: 装箱:把值类型转换成引用类型 拆箱:把引用类型转换成值类型 装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。 (1)第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针。 (2)第二步:将值类型的实例字段拷贝到新分配的内存中。 (3)

  • 本文向大家介绍什么是装箱(boxing)和拆箱(unboxing)? (*)相关面试题,主要包含被问及什么是装箱(boxing)和拆箱(unboxing)? (*)时的应答技巧和注意事项,需要的朋友参考一下 Object是引用类型,但是它的子类Int32竟然不能去Object能去的“要求必须是引用类型” 的地方,违反了继承的原则,所以需要把Int32装在Object中才能传递。 装箱:从值类型接口

  • 问题内容: 从JDK 5.0开始,自动装箱/拆箱是在Java中引入的,这种技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中的工作原理: Boxing 尝试不同的情况下后(),这是由编译器所接受的唯一情况是,当值的上做作运算符右侧的类型是int。当我查看源代码时,发现它仅实现一个带参数的构造函数。 因此,我的结论是,自动装箱的概念基于

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