在Java中,字符类型(Character)是自动装箱还是拆箱的(autoboxed或unboxed)?

8
我在考虑这段简单的代码:

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

所以结果很好,但是这个比较是如何工作的呢?是将Character对象拆箱为char还是char自动装箱为Character?

这只是一个关于自动装箱的工作原理以及**Character.equals(Object)如何实现**的问题。 - AxelH
ez +80 声望。 - Jay
4个回答

8
== 测试的情况下,Java语言规范第15.21节解释说,Character会被取消装箱为一个数字类型的char

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

在§15.21.1中:

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

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

equals()的情况下,char值被装箱为一个Character,因为equals()的参数需要是引用类型。

5
你正在调用的equals方法(在s.equals('y')中)是Character类的一个方法,它接受一个Object参数。因此,你传递给它的char参数必须被装箱。
由于实际比较使用Character类的value成员(其类型为char),所以不需要拆箱。
public boolean equals(Object obj) {
    if (obj instanceof Character) {
        return value == ((Character)obj).charValue();
    }
    return false;
}

2
当您执行以下操作时:
s == 'y' 

字符's'将会拆箱成char

当你这样做时:

s.equals('y') 

'y'会自动装箱,因为equals()Character类的方法,就像@Eran所说的那样。


1

s == 'y' 是未装箱的,而 s.equals('y') 是自动装箱的。要检查它,只需尝试在 Character 类的 equals 方法内设置断点并调试您的程序,您可以发现它是自动装箱还是未装箱。在第一种情况下,您将看不到控件进入,但在第二种情况下会有。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接