web-dev-qa-db-ja.com

整数オブジェクトの比較

私は次のコードを持っています:

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を出力しないのはなぜですか?

31
Luke Taylor

参照タイプの場合、==は、参照が等しいかどうか、つまり参照が同じオブジェクトを指しているかどうかをチェックします。

プリミティブ型の場合、==は、値が等しいかどうかを確認します。

Java.lang.Integerは参照型です。 intはプリミティブ型です。

編集:一方のオペランドがプリミティブ型で、もう一方が適切なプリミティブ型に展開される参照型の場合、==は、参照ではなく値を比較します。

33
meriton

整数オブジェクトはオブジェクトです。これは論理的に聞こえますが、質問に対する答えです。オブジェクトはnewキーワードを使用してJavaで作成され、メモリに格納されます。比較するときは、オブジェクトの値/プロパティではなく、オブジェクトのメモリ位置を比較しますオブジェクト。

.equals()メソッドを使用して、オブジェクトのメモリ内の場所ではなく、オブジェクトの値/プロパティを実際に比較します。

new Integer(1) == new Integer(1)falseを返し、new Integer(1).equals(new Integer(1))trueを返します。


intsは、プリミティブ型のJavaです。 intを作成すると、参照されるのは値だけです。 Javaでプリミティブ型を比較す​​る場合、比較されるのはメモリの場所ではなく値のみです。 _5 == 5_が常にtrueを返す理由です。

Integerオブジェクトをプリミティブ型と比較すると、可能であれば、オブジェクトはプリミティブ型にキャストされます。 Integerintを使用すると、これが可能になるため、比較されます。 Integer(1).equals(1)がtrueを返す理由です。

7
Hidde

new Integer(1)を使用して新しいオブジェクトを作成すると、同じ値であっても毎回まったく異なるオブジェクトが作成されます。 「==」は、オブジェクトがデータ値ではなく同じかどうかをチェックします。あなたの場合、次のように値を確認できます。

if(alpha.intValue() == foo.intValue()) {
 // 
}
1
fastcodejava

ここで整数== intオートボクシングが適用されたため(比較の前に整数がintに変換されたため)、true ..

1

最初の例:オブジェクト間で==演算子を使用すると、参照の等価性がチェックされます。2つの異なるオブジェクトを比較しているため、等しくありません。

2番目の例:ラッパー型(整数、Longなど)と数値型(int、longなど)の間に==を使用すると、ラッパー型はボックス化されず、2つのプリミティブな数値型の間で等価性チェックが行われます(すなわちintint)の間。アンボックス化はバイナリ数値プロモーションの一部です。詳細はこちらをご覧ください。 http://docs.Oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 =

0
uldall