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

Character等于char是自动装箱还是在java中未装箱?[重复]

劳彦
2023-03-14

我正在考虑这个简单的代码:

Character s = 'n';
System.out.println(s == 'y');
System.out.println(s.equals('y'));

s = 'y';
System.out.println(s == 'y');
System.out.println(s.equals('y'));

结果

false
false
true
true

因此,结果是好的,但是,这种比较是如何工作的呢?角色对象是否取消绑定到角色,或者聊天是否自动装箱到角色?

共有3个答案

翟展
2023-03-14

执行此操作时:

s == 'y' 

字符's'将解压为char

当你这样做的时候:

s.equals('y') 

'y'将是autobox,因为equals()是字符的方法,就像@Eran所说的。

姬俊驰
2023-03-14

您正在调用的equals方法(在s.equals('y')中)是一个接受Object参数的Character类的方法。因此,您传递给它的char参数必须被装箱。

没有必要取消装箱,因为Character类的value成员(其类型是char)用于实际比较:

public boolean equals(Object obj) {
    if (obj instanceof Character) {
        return value == ((Character)obj).charValue();
    }
    return false;
}
怀洛华
2023-03-14

==测试的情况下,Java语言规范第15.21节解释了字符未绑定到字符(数字类型)。

相等运算符可用于比较两个可转换为数值类型(§5.1.8)的操作数,或两个布尔或布尔类型的操作数,或两个引用类型或空类型的操作数。

在§15.21.1中:

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

请注意,二进制数字提升执行值集转换(§5.1.13),并可能执行拆箱转换(§5.1.8)。

对于equals(),由于equals()的参数需要是引用类型,因此char值被装箱为字符。

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

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

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

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

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

  • 如果被装箱的值是和之间的类型的整数文字(§3.10.1),或者是或(§3.10.3),或者是和之间的字符文字(§3.10.4),则让和是任意两次装箱转换的结果。情况总是。 描述行为的 <罢工> 一模一样 与相似*。但似乎并不能保证确实被调用,这意味着理论上可能有一个实现为自动装箱的值保留一个单独的专用缓存。在这种情况下,缓存的自动装箱值和常规缓存的装箱值之间的标识可能不相等。 Oracle的“自动