9

あるフォーラムのスレッドで、多くの人や経験豊富なJava開発者でさえ、次のJavaコードの平和を理解できないだろうと仮定した人がいます。

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1++ == i2++);
System.out.println(i1 == i2);

Javaに興味のある人として考えてみたところ、次のような結果になりました。

System.out.println(i1++ == i2++);
// True, since we first check for equality and increment both variables afterwards.

System.out.println(i1 == i2);
// True again, since both variables are already incremented and have the value 128

Eclipseはそうではないと教えてくれます。最初の行はtrueで、2番目の行はfalseです。

本当に説明をいただければ幸いです。

2番目の質問。これはJava固有ですか、それともこの例はたとえばCベースの言語にも当てはまりますか?

4

2 に答える 2

14
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1++ == i2++); 
// here i1 and i2 are still 127 as you expected thus true
System.out.println(i1 == i2); 
// here i1 and i2 are 128 which are equal but not cached
    (caching range is -128 to 127), 

ケース2では、整数の演算子はキャッシュされた値に対してのみ機能するため、これを使用equals()するとtrueが返されます。==128はキャッシュ範囲外であるため、128を超える値はキャッシュされません。したがって、equals()メソッドを使用して、127を超える2つの整数インスタンスが真であるかどうかを確認する必要があります。

テスト:

Integer i1 = 126;
    Integer i2 = 126;
    System.out.println(i1++ == i2++);// true
    System.out.println(i1 == i2); //true



 Integer i1 = 126;
        Integer i2 = 126;
        System.out.println(i1++ == i2++);// true
        System.out.println(i1.equals(i2)); //true

  Integer i1 = 128;
        Integer i2 = 128;
        System.out.println(i1++ == i2++);// false
        System.out.println(i1==i2); //false

  Integer i1 = 128;
        Integer i2 = 128;
        System.out.println(i1++.equals(i2++));// true
        System.out.println(i1.equals(i2)); //true
于 2013-02-25T10:27:16.370 に答える
1

説明したように、これは整数キャッシュによるものです。楽しみのために、次のJVMオプションを使用してプログラムを実行できます。

-XX:AutoBoxCacheMax=128

そしてそれはtrueを2回出力します(ホストポット7で利用可能なオプション-必ずしも他のJVMではありません)。

ご了承ください:

  • これはJVM固有です
  • 変更された動作はJLSに準拠しており、-128〜 + 127のすべての値をキャッシュする必要があると述べていますが、他の値キャッシュされる可能性があると述べています。

結論:2番目のprintステートメントはJavaで定義されておらず、JVMの実装や使用されているJVMオプションに応じてtrueまたはfalseを出力できます。

于 2013-02-25T10:42:24.630 に答える