非常に基本的な質問ですが、その概念を明確にしたいと思います。どのように==
演算子は、プリミティブおよびオブジェクトタイプの場合に機能します。例えば
Integer a = 1;
int b = 1;
System.out.println(a == b)
a
はb
とどのように比較されますか?一方、a
には、値1を含むオブジェクトの参照が含まれます。
一般に、Javaの等式演算子は、いわゆる浅い比較を実行します。つまり、変数に含まれる値を比較します。プリミティブデータ型の変数には値自体が含まれ、参照型には値が含まれます。実際のコンテンツを格納するヒープ領域への参照。つまり、コードスニペットではint b
は値を保持します1
およびInteger a
は、ヒープ上の実際のIntegerオブジェクトのメモリアドレスを保持します。
今、あなたによって提供された特定の例では、1つの特異性があります。整数クラスプリミティブ整数型をラップする特別なラッパークラス。コンパイラは、このようなラッパーオブジェクトとプリミティブ型(ボックス化およびボックス化解除と呼ばれます)の間で自動的に変換できます。
コードを段階的に説明していきましょう。
Integer a = 1;
コンパイラーは、実際には、この行の代わりに次のコードを使用します。
Integer a = Integer.valueOf(1);
静的メソッドvalueOf
は、指定されたプリミティブ値をラップするラッパーオブジェクトインスタンスを返します。コンパイラがプリミティブ型からラッパークラスを構築するときのこの手順は、ボクシングと呼ばれます。
このようなラッパーオブジェクトを使用すると、等式演算子を使用してプリミティブ変数と比較されます
a == b
コンパイラは実際にそれを次のように変更します。
a.intValue() == b;
ここで、intValue
は、ラッパーオブジェクトによってラップされたプリミティブ値を返します(ボックス化解除と呼ばれます)。つまり、プリミティブ値をボックス化解除し、式を2つのプリミティブの比較と同等にします。これが、等式演算子がtrue
を返した理由です。
特定の例では、ボックス化された型Integerがプリミティブ型intにボックス化されておらず、==
がプリミティブを比較します(つまり、あなたの場合はtrue)。