当前位置: 首页 > 知识库问答 >
问题:

自动装箱是否调用valueOf()?

公良照
2023-03-14
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)

如果被装箱的值p-128127之间的int类型的整数文字(§3.10.1),或者是truefalse(§3.10.3),或者是'\u0000''\u007f'之间的字符文字(§3.10.4),则让abp任意两次装箱转换的结果。情况总是a==b

描述行为的 <罢工> 一模一样 与valueof()相似*。但似乎并不能保证valueof()确实被调用,这意味着理论上可能有一个实现为自动装箱的值保留一个单独的专用缓存。在这种情况下,缓存的自动装箱值和常规缓存的装箱值之间的标识可能不相等。

Oracle的“自动装箱”教程实事求是地指出,li.add(i)编译li.add(integer.valueof(i)),其中i是一个int。但我不知道教程是否应该被认为是一个权威来源。

*它的保证比valueof()稍弱,因为它只引用文字值。

共有1个答案

孟征
2023-03-14

我首先问你的问题是一个欺骗,编译器为自动装箱生成什么代码

但是,当你在@ElliottFrisch上发表评论后,我意识到这是不一样的:

我知道编译器的行为是那样的。我想弄清楚这种行为是不是有保障的。

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

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

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

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

  • 有以下代码: 它打印: 12 这个不能编译。为什么?

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