web-dev-qa-db-ja.com

equal演算子がプリミティブおよびオブジェクトタイプのデータをどのように処理するか

非常に基本的な質問ですが、その概念を明確にしたいと思います。どのように==演算子は、プリミティブおよびオブジェクトタイプの場合に機能します。例えば

Integer a = 1;
int b = 1;
System.out.println(a == b)

abとどのように比較されますか?一方、aには、値1を含むオブジェクトの参照が含まれます。

12
Still Learning

一般に、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を返した理由です。

16
akhilless

特定の例では、ボックス化された型Integerがプリミティブ型intにボックス化されておらず、==がプリミティブを比較します(つまり、あなたの場合はtrue)。

5
Sergey Pauk