理解する必要のあるコードがあります。
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
と==
の質問とは異なります。
c
とcy
はCharacter
クラスの異なるインスタンスを参照するため(コンストラクターを呼び出すたびに、新しいインスタンスを作成します)、これらの参照を比較するとfalse
。
一方、それらのいずれかをプリミティブcx
と比較すると、ボックス化されていない状態でchar
になり、char
の比較はtrueを返します。
Character.valueOf('a')
の代わりにnew Character('a')
を使用した場合、両方の呼び出しで同じインスタンスを取得し、参照比較はtrue
を返します(valueOf
は、引数<= 127の場合、キャッシュされたCharacter
インスタンスを返します。
System.out.println(c == cx);
System.out.println(cx == cy);
1つはプリミティブで、もう1つはそのラッパークラスであるため、 ボックス化解除が発生します そしてプリミティブ比較が行われます(==)。
一方:
System.out.println(c == cy);
オブジェクトの比較です。さまざまなインスタンスが比較されているので、==
この場合は機能しません。