4

私はクラスのJavaキャッシュを読んでいますが、なぜこのコードが機能するのか正確にはわかりません。

Integer x = new Integer(2);
Integer y = new Integer(2);
assert x            != y;
assert x.intValue() == y.intValue();
++x;
assert x            != y;
assert x.intValue() != y.intValue();
++y;
assert x            == y;
assert x.intValue() == y.intValue();

xとyは異なるオブジェクトを参照しているため、最初は等しくないことを理解していますが、++の後でなぜ等しくなるのですか?

4

2 に答える 2

5

インクリメント後、それらは、を使用して再ボックス化さInteger.valueOf()れ、絶対値が小さい場合(デフォルトの間)、キャッシュされたインスタンスを使用します-128127

于 2012-11-01T00:09:16.537 に答える
4

ここでのキーワードは整数キャッシュです。*Integerの下の値はキャッシュされ、インターン結果を返します。128++valueOf

キャッシングがどのように機能するかを理解するために実行できる2つの楽しい実験がありますIntegers

  • に置き換えnew Integer(2)て、すぐInteger.valueOf(2)にそれを観察してくださいx==y
  • に置き換え2200、それを観察し、のオブジェクトx++y++返します


*これを制御するオプションがあります:java.lang.Integer.IntegerCache.high=high_val

于 2012-11-01T00:10:17.020 に答える