1

次のような式がある場合、

Integer x=500;
Integer y=500;

System.out.println(x==y);

オブジェクト参照を比較しているため、操作の結果は次のx==yようになります。false


xこれら2つの変数とy次のようなループがある場合、

Integer x=0;
Integer y=0;

for(int i=0;i<2000;i++)
{
    System.out.println((x==y)+" : "+x+++" : "+y++);
}

次に、 とのtrue両方の値が になるまで表示します。他のすべての場合 (つまり、 と の値がインクリメントされた場合 - これらの変数の値が より大きい場合)。xy127xy127127

では、なぜこれが起こるのですか?この動作の仕様はありますか?

4

2 に答える 2

2

-128 から +127 までの値の整数がJVMにキャッシュされます。

さらに、これに関するJava言語仕様ページがあります。具体的には、セクション 5.1.7 の状態

ボックス化された値 p が true、false、\u0000 ~ \u007f の範囲のバイト、または char、または -128 ~ 127 (両端を含む) の int または short の数値である場合、r1 および r2 を次の結果とします。 p の任意の 2 つのボクシング変換。r1 == r2 は常にそうです。

于 2013-03-11T23:57:03.733 に答える
1

これはプリミティブ型のボックス化のケースであり、正しいです。JavaIntegersは、最大 128 の値の flyweight パターンを使用してキャッシュされます。

于 2013-03-11T23:49:01.727 に答える