23
  public class WrapperTest {

    public static void main(String[] args) {

        Integer i = 100;
        Integer j = 100;

        if(i == j)
            System.out.println("same");
        else
            System.out.println("not same");
    }

   }

上記のコードを実行すると の出力が得られますが、とsameの値を 1000 に変更すると、出力は に変わります。私は SCJP の準備をしているので、この背後にあるコンセプトを明確にする必要があります。誰かがこの動作を説明できますか.Thank.ijnot same

4

5 に答える 5

21

Java では、-128 から 127 (両端を含む) までの整数は、通常、同じ Integer オブジェクト インスタンスによって表されます。これは、IntegerCache と呼ばれる内部クラスを使用して処理されます (Integer クラス内に含まれ、Integer.valueOf() が呼び出されたとき、またはオートボクシング中に使用されます)。

private static class IntegerCache {
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
    }
}

参照: http://www.owasp.org/index.php/Java_gotchas

于 2009-01-19T05:14:16.817 に答える
7

基本的に、-127 から 127 までの整数は、これらの数値を使用するときに常にメモリ内の同じ数値を参照するように「キャッシュ」されます。これが機能する理由==です。

その範囲外の整数はキャッシュされないため、参照は同じではありません。

于 2009-01-19T05:12:41.453 に答える
5

@tunaranchは正しいです。このPython questionと同じ問題でもあります。要点は、Java は -128 から 127 までの整数 (Python は -5 から 256 まで) のオブジェクトを保持し、要求するたびに同じオブジェクトを返すということです。この固定範囲外の整数を要求すると、毎回新しいオブジェクトが返されます。

==( whileは 2 つのオブジェクトが実際に同じかどうかを返し、equalsその内容を比較することを思い出してください。)

編集: Java言語仕様のセクション5.1.7の関連する段落は次のとおりです。

ボックス化される値ptruefalse、 a byte、 aから までcharの範囲 の a 、または -128 から 127 までの int または short の数値である場合、 r1r2を p の任意の 2 つのボックス化変換の結果とします。r1 == r2の場合は常にそうです。\u0000\u007f

これは、他のタイプで何が起こるかについても説明していることに注意してください。

于 2009-01-19T05:11:56.137 に答える
4

平等とオートボクシングに関係しています: http://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html

于 2009-01-19T05:08:42.210 に答える
0

あなたのコードはコンパイルされません。これは私が得るものです:

スレッド「メイン」の例外 java.lang.Error: 未解決のコンパイルの問題: 型の不一致: int から Integer に変換できません 型の不一致: int から Integer に変換できません

at WrapperTest.main(WrapperTest.java:5)

変数 i と j は Integer オブジェクトのインスタンスです。「==」演算子を使用してオブジェクトのインスタンスを比較しないでください。代わりに「equals」メソッドを使用してください。

ご挨拶

于 2009-01-19T08:53:20.510 に答える