我正在考虑这个简单的代码:
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 对象是取消装箱为字符还是聊天自动装箱为字符?
在==测试的情况下,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()需要是引用类型。
在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)