将基元对象与包装器对象进行比较,其中 == 行为无法解释

2022-09-01 16:36:18

我有一段代码需要理解:

public static void main(String[] args) {
    Character c = new Character('a');
    Character cy = new Character('a');
    char cx = 'a';

    System.out.println(c == cx);
    System.out.println(cx == cy);
    System.out.println(c == cy);
}

输出:

true
true
false

我无法理解为什么只有第三种说法失败了。

编辑:这个问题与vs问题不同,因为这是关于原始与对象比较的。.equals==


答案 1

c并引用类的不同实例(每次调用构造函数时,都会创建一个新实例),因此比较这些引用将返回 。cyCharacterfalse

另一方面,当您将它们中的任何一个与基元进行比较时,它们将被取消装箱到 ,并且比较返回 true。cxcharchar

如果使用 而不是 ,您将在两个调用中获得相同的实例,并且将返回引用比较(因为如果参数<= 127,则返回缓存的实例)。Character.valueOf('a')new Character('a')truevalueOfCharacter


答案 2
 System.out.println(c == cx);
 System.out.println(cx == cy);

由于一个是基元的,另一个是它的包装类,因此会发生取消装箱并进行基元比较(==)。

而:

 System.out.println(c == cy);

是对象比较。不同的实例正在进行比较,因此在这种情况下不起作用。==