私は次のコードを持っています:
public class Test {
public static void main(String[] args) {
Integer alpha = new Integer(1);
Integer foo = new Integer(1);
if(alpha == foo) {
System.out.println("1. true");
}
if(alpha.equals(foo)) {
System.out.println("2. true");
}
}
}
出力は次のとおりです。
2. true
ただし、Integer object
のタイプをint
に変更すると、次のような異なる出力が生成されます。
public class Test {
public static void main(String[] args) {
Integer alpha = new Integer(1);
int foo = 1;
if(alpha == foo) {
System.out.println("1. true");
}
if(alpha.equals(foo)) {
System.out.println("2. true");
}
}
}
新しい出力:
1. true
2. true
どうしてこんなことができるのでしょうか?最初のサンプルコードが1. true
を出力しないのはなぜですか?
参照タイプの場合、==
は、参照が等しいかどうか、つまり参照が同じオブジェクトを指しているかどうかをチェックします。
プリミティブ型の場合、==
は、値が等しいかどうかを確認します。
Java.lang.Integer
は参照型です。 int
はプリミティブ型です。
編集:一方のオペランドがプリミティブ型で、もう一方が適切なプリミティブ型に展開される参照型の場合、==
は、参照ではなく値を比較します。
整数オブジェクトはオブジェクトです。これは論理的に聞こえますが、質問に対する答えです。オブジェクトはnew
キーワードを使用してJavaで作成され、メモリに格納されます。比較するときは、オブジェクトの値/プロパティではなく、オブジェクトのメモリ位置を比較しますオブジェクト。
.equals()
メソッドを使用して、オブジェクトのメモリ内の場所ではなく、オブジェクトの値/プロパティを実際に比較します。
new Integer(1) == new Integer(1)
はfalse
を返し、new Integer(1).equals(new Integer(1))
はtrue
を返します。
int
sは、プリミティブ型のJavaです。 intを作成すると、参照されるのは値だけです。 Javaでプリミティブ型を比較する場合、比較されるのはメモリの場所ではなく値のみです。 _5 == 5
_が常にtrueを返す理由です。
Integer
オブジェクトをプリミティブ型と比較すると、可能であれば、オブジェクトはプリミティブ型にキャストされます。 Integer
とint
を使用すると、これが可能になるため、比較されます。 Integer(1).equals(1)
がtrueを返す理由です。
new Integer(1)
を使用して新しいオブジェクトを作成すると、同じ値であっても毎回まったく異なるオブジェクトが作成されます。 「==」は、オブジェクトがデータ値ではなく同じかどうかをチェックします。あなたの場合、次のように値を確認できます。
if(alpha.intValue() == foo.intValue()) {
//
}
ここで整数== intオートボクシングが適用されたため(比較の前に整数がintに変換されたため)、true ..
最初の例:オブジェクト間で==演算子を使用すると、参照の等価性がチェックされます。2つの異なるオブジェクトを比較しているため、等しくありません。
2番目の例:ラッパー型(整数、Longなど)と数値型(int、longなど)の間に==を使用すると、ラッパー型はボックス化されず、2つのプリミティブな数値型の間で等価性チェックが行われます(すなわちintとint)の間。アンボックス化はバイナリ数値プロモーションの一部です。詳細はこちらをご覧ください。 http://docs.Oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 =