10

どんな体でも、出力で何が起こっているのかを説明してくれますか。==の場合、2つの参照を比較するために使用されます。変数それは単にそれらが同じであるかどうかその参照をチェックし、それからそれは本体の場合に入力します、そして静的メソッドvalueOf()を作成する場合は地獄aa == bbが等しいのはなぜですか?新しいキーワードを使用するオブジェクト?

static void main(String args[])
{
    Integer aa = Integer.valueOf("12");
    Integer bb = Integer.valueOf("12");
    if(aa==bb)System.out.println("aa==bb");
    if(aa!=bb)System.out.println("aa!=bb");
    Integer ee = new Integer("12");
    Integer ff = new Integer("12");


    if(ee==ff)System.out.println("ee==ff");
    if(ee!=ff)System.out.println("ee!=ff");
}

出力:

aa == bb

ee!= ff

4

4 に答える 4

11

コンパレータはオブジェクトの==同等性をチェックします!

Integer.valueOf値が-128〜127の整数オブジェクトのキャッシュを維持するため、キャッシュさvalueOf(String)れたオブジェクトが返されるため、比較の==結果はtrueになります。

Integer a1 = new Integer("12");
Integer b1 = new Integer("12");
//a1 == b1 returns false because they point to two different Integer objects

Integer aa = Integer.valueOf("12");
Integer bb = Integer.valueOf("12");
//aa == bb returns true because they point to same cached object

オブジェクト値の比較には常に.equalsメソッドを使用し、int、longなどのプリミティブには==コンパレータを使用できます。

于 2012-10-13T07:51:28.483 に答える
3

からまでInteger.valueOfの整数のキャッシュを維持するため-128127

これがソースコードで、整数値がとの間にvalueOfある場合に同じオブジェクトを返すことがはっきりとわかります。-128127

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

だからあなた==は真を返します。値がそれより大きい場合、常にfalseが返されます。

    Integer aa = Integer.valueOf("1200");
    Integer bb = Integer.valueOf("1200");
    aa == bb --> false

常にequalsメソッドを使用して同等性をチェックする必要があります

ee.equals(ff);

以下の場合、別の場合を追加する場合

    if (ee.equals(ff))
        System.out.println("ee equals ff");

出力は

 ee equals ff
于 2012-10-13T07:51:46.390 に答える
1

new Integer("12")値12の新しい整数オブジェクトを作成します。何度行っても、毎回新しいオブジェクトを作成します。そのため==、2番目のケースでは機能しません。

JVMは、より頻繁に使用されると考えられる値(-128〜127)の整数オブジェクトのキャッシュを維持します。Integer.valueOf("12")舞台裏でも同じことnew Integer("12")を行います()が、その前に、その値についてオブジェクトがキャッシュにすでに存在するかどうかをチェックインします。存在する場合は、それが返されます。存在しない場合は、新しいオブジェクトが作成され、に追加されます。キャッシュを返します。そのため==、最初のケースで機能します。

また、オブジェクトの場合、==同等性チェックには使用しないでください。代わりに、IDチェックにのみ使用する必要があります(たとえば、2つの異なる変数が同じオブジェクトを参照しているかどうかを確認するため)。同等性チェックには、常にこのequalsメソッドを使用してください。

于 2012-10-13T08:01:03.037 に答える
1

eeとffの場合、の2つのオブジェクトがIntegerヒープ上に作成されるため、両方が異なるオブジェクトを参照しているため、==演算子を使用する場合は等しくありません。

于 2012-10-13T07:54:05.530 に答える