1

次のコードについて質問があります。

public class Equivalence {
    public static void main(String[] args) {
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
    }
}

結果の出力は私を驚かせました:

false
true

Javadoc オンラインでコンストラクターを確認しましたが、そこからは何の助けにもなりません。

前もって感謝します

ありがとうございました

4

5 に答える 5

4

equals値の等価性をチェックするために使用する必要があります。Integer は int 値をラップするラッパー クラスであるためです。==参照に基づいて同等性をチェックするため、どちらの場合も参照が異なります。

このオブジェクトを指定されたオブジェクトと比較します。引数が null ではなく、このオブジェクトと同じ int 値を含む Integer オブジェクトである場合にのみ、結果は true になります。

 n1.equals(n2);

もしあなたがそうするなら

int n1 = new Integer(47);
int n2 = new Integer(47);

期待どおりの出力が得られます。

127Java は からまでの整数のプールを維持するため、次の-128こともできます。

 Integer n1 = Integer.valueOf(47);
 Integer n2 = Integer.valueOf(47);<-- will return you the same reference
     n1==n2 >>> True
于 2012-11-03T20:20:52.993 に答える
3

と確実に比較できるのはプリミティブ型だけ==です。オブジェクト (およびIntegerオブジェクト タイプ) の場合、equals()メソッドを使用する必要があります。

==オブジェクトに使用できますが、2 つのオブジェクトが実際に同じかどうかを確認するためだけに使用できます。たとえば、次のようになります。

Integer n1 = new Integer(47);
Integer n2 = n1;
// n1 == n2 will be true

ints は数字そのもの、Integers は数字が書かれたポストイットだと思ってください。==は、同じポストイットについて話している場合にのみ trueequals()を返しますが、同じ番号を持つ 2 つのメモについては true を返します。

この問題を複雑にしているのは、Java のバージョン 1.5 以降には autoboxing もあるということです。注意しないと、これは非常に驚くべき結果につながる可能性があります。intInteger

于 2012-11-03T20:23:21.463 に答える
1

オブジェクト参照を比較している n1 と n2 の値を比較していないためだと思います。そして、それらは 2 つの異なるオブジェクトであるため、それらの参照は同じではありません。

したがって、 equals() メソッドを使用してそれらの値を比較する必要があります

于 2012-11-03T20:24:09.453 に答える
1

java.Lang.IntegerobjectJavaのです。equals()メソッドを使用して、2 つの Integer オブジェクトが等しいかどうかを確認する必要があります

整数オブジェクトへのn1参照と別の整数オブジェクトへのn2参照が同じ整数オブジェクトを参照しているかどうかを確認しています。==演算子は、2 つの参照変数が同じオブジェクトを参照しているかどうかをチェックするためです。この場合、そうではありません。試す

              Integer n1 = New Integer(47);
              Integer n2 = New Integer(47);
              System.out.println(n1.equals(n2));
              System.out.println(n1.equals(n2));
于 2012-11-03T20:24:46.550 に答える
1

n1 == n2オブジェクトインスタンスを比較するため、返されn1 == n2false同じオブジェクトインスタンスではありません。n1 != n2truen1n2

メソッドを使用equalsするか、int (primitive tpye)値を取得してから比較する== or !=と、正しい結果が得られます。

    System.out.println(n1.equals(n2)); //true
    System.out.println(!n1.equals(n2));//false

また

    System.out.println(n1.intValue() == n2.intValue()); //true
    System.out.println(n1.intValue() != n2.intValue()); //false
于 2012-11-03T20:23:44.473 に答える