3

次のコードがあります。

public static void doIntCompareProcess() {
    int a = 100;
    int b = 100;

    Integer c = 200;
    Integer d = 200;

    int f = 20000;
    int e = 20000;

    System.out.println(c == d);
    compareInt(e, f);
    compareInt(a, b);
}

public static void compareInt(Integer v1, Integer v2) {
    System.out.println(v1 == v2);
}

これにより、次の出力が得られます。

false
false
true

現在の出力は次の場所にあります。

false
false
false

コードに対して間違った出力が得られるのはなぜですか?

4

2 に答える 2

11

最後の行は次のものに対応します。

compareInt(100, 100);

compareInt()2 つのオブジェクトを受け取るためInteger、2 つのパラメーターは自動的にボックス化されます。Integer(n) そのプロセス中に、 の小さな値のnインスタンスがインターンされます。つまり、同じオブジェクトcompareInt()への 2 つの参照を受け取ります。これが、最後の比較が に評価される原因です。Integer(100)true

Java で == 演算子を使用してラッパー オブジェクトを比較するを参照してください。

肝心なのは、オブジェクト==を直接比較するために演算子を使用しないことです。Integer詳細については、https://stackoverflow.com/a/1515811/367273を参照してください。

于 2012-05-15T08:18:10.833 に答える
3

プリミティブ バイト範囲 -128 ~ 127 の整数値は、パフォーマンス上の理由からキャッシュされます。100 はこの範囲の値であるため、キャッシュから同じオブジェクトが毎回返されます。この範囲外の値は頻繁には必要ないと考えられ、新しい Integer オブジェクトが返されます。あなたのケースでは、値ではなくオブジェクト参照を比較しています.100はキャッシュから来ているので、compareInt()の引数は同じオブジェクトを指しているため、比較はtrueと同等です.

于 2012-05-15T08:30:58.413 に答える