31

次のコードがあります。

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 objecttoのタイプを変更する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ですか?

4

5 に答える 5

39

参照型の場合==、参照が等しいかどうか、つまり、同じオブジェクトを指しているかどうかを確認します。

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

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

編集:一方のオペランドがプリミティブ型であり、もう一方のオペランドが適切なプリミティブ型にボックス化されて==いない参照型の場合、参照ではなく値を比較します。

于 2012-09-22T20:06:04.297 に答える
7

整数オブジェクトはオブジェクトです。これは論理的に聞こえますが、質問に対する答えです。オブジェクトは、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が返されます。

于 2012-09-22T20:05:56.233 に答える
2

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

if(alpha.intValue() == foo.intValue()) {
 // 
}
于 2012-09-22T20:11:54.413 に答える
1

Integer == int here自動ボクシングが適用されます(したがって、整数は比較前にintに変換されます)。

于 2012-09-22T20:07:01.490 に答える
0

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

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

于 2012-09-22T20:07:30.660 に答える