字符等于字符在 Java 中是自动装箱还是拆箱?

use*_*064 8 java

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

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'));
Run Code Online (Sandbox Code Playgroud)

结果

false
false
true
true
Run Code Online (Sandbox Code Playgroud)

所以结果是好的,但是,这个比较是如何工作的?Character 对象是取消装箱为字符还是聊天自动装箱为字符?

Ted*_*opp 8

==测试的情况下,Java 语言规范的第 15.21 节解释了Character未装箱为 a char(数字类型)。

相等运算符可用于比较两个可转换(第 5.1.8 节)为数字类型的操作数,或两个 boolean 或 Boolean 类型的操作数,或两个均为引用类型或 null 类型的操作数。

在 §15.21.1 中:

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

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

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


Era*_*ran 5

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

不需要拆箱,因为类的value成员Character(类型为 a char)用于实际比较:

public boolean equals(Object obj) {
    if (obj instanceof Character) {
        return value == ((Character)obj).charValue();
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)