web-dev-qa-db-ja.com

プリミティブとラッパーオブジェクトを==動作の説明なしで比較する

理解する必要のあるコードがあります。

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

3番目のステートメントだけが失敗している理由を理解できません。

編集:この質問は、プリミティブとオブジェクトの比較に関するものであるため、.equals==の質問とは異なります。

26
Fr_nkenstien

ccyCharacterクラスの異なるインスタンスを参照するため(コンストラクターを呼び出すたびに、新しいインスタンスを作成します)、これらの参照を比較するとfalse

一方、それらのいずれかをプリミティブcxと比較すると、ボックス化されていない状態でcharになり、charの比較はtrueを返します。

Character.valueOf('a')の代わりにnew Character('a')を使用した場合、両方の呼び出しで同じインスタンスを取得し、参照比較はtrueを返します(valueOfは、引数<= 127の場合、キャッシュされたCharacterインスタンスを返します。

45
Eran
 System.out.println(c == cx);
 System.out.println(cx == cy);

1つはプリミティブで、もう1つはそのラッパークラスであるため、 ボックス化解除が発生します そしてプリミティブ比較が行われます(==)。

一方:

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

オブジェクトの比較です。さまざまなインスタンスが比較されているので、==この場合は機能しません。

25
Suresh Atta