Integer参照へのintリテラルの直接割り当ては自動ボックス化の例であり、オブジェクト変換コードへのリテラル値はコンパイラーによって処理されます。
したがって、コンパイル段階でコンパイラはに変換さInteger a = 1000, b = 1000;
れInteger a = Integer.valueOf(1000), b = Integer.valueOf(1000);
ます。
つまり、Integer.valueOf()
実際に整数オブジェクトを提供するのはメソッドであり、Integer.valueOf()
メソッドのソースコードを見ると、メソッドが-128〜127(両端を含む)の範囲の整数オブジェクトをキャッシュしていることがはっきりとわかります。
/**
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
そのため、渡されたintリテラルが-128より大きく127より小さい場合Integer.valueOf()
、メソッドは新しい整数オブジェクトを作成して返す代わりに、内部からIntegerオブジェクトを返しますIntegerCache
。
Javaはこれらの整数オブジェクトをキャッシュします。これは、この整数の範囲が間接的に一部のメモリを節約するプログラミングで日常的に使用されるためです。
静的ブロックのためにクラスがメモリに読み込まれると、最初の使用時にキャッシュが初期化されます。キャッシュの最大範囲は、-XX:AutoBoxCacheMax
JVMオプションで制御できます。
整数は、我々はまた、持っているInteger.IntegerCacheと同様に、オブジェクトだけのためにこのキャッシュの動作は適用されないByteCache, ShortCache, LongCache, CharacterCache
ためByte, Short, Long, Character
、それぞれ。
詳細については、私の記事「Java Integer Cache-Why Integer.valueOf(127)== Integer.valueOf(127)Is True」を参照してください。