Bezpośrednie przypisanie literału int do odwołania Integer jest przykładem automatycznego pakowania, w którym wartość literału do kodu konwersji obiektu jest obsługiwana przez kompilator.
Tak więc podczas fazy kompilacji kompilator konwertuje Integer a = 1000, b = 1000;
doInteger a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
Jest to więc Integer.valueOf()
metoda, która faktycznie daje nam obiekty będące liczbami całkowitymi, a jeśli spojrzymy na kod źródłowy Integer.valueOf()
metody, wyraźnie widać, że metoda buforuje obiekty typu integer w zakresie od -128 do 127 (włącznie).
/**
*
* 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);
}
Dlatego zamiast tworzyć i zwracać nowe obiekty całkowite, Integer.valueOf()
metoda zwraca obiekty typu Integer z wewnętrznego, IntegerCache
jeśli przekazany literał int jest większy niż -128 i mniejszy niż 127.
Java buforuje te obiekty liczb całkowitych, ponieważ ten zakres liczb całkowitych jest często używany w codziennym programowaniu, co pośrednio oszczędza trochę pamięci.
Pamięć podręczna jest inicjowana przy pierwszym użyciu, gdy klasa zostanie załadowana do pamięci ze względu na blok statyczny. Maksymalny zakres pamięci podręcznej można kontrolować za pomocą -XX:AutoBoxCacheMax
opcji JVM.
Takie zachowanie buforowania nie dotyczy tylko obiektów Integer, podobnie Integer.IntegerCache mamy także ByteCache, ShortCache, LongCache, CharacterCache
dlaByte, Short, Long, Character
odpowiednio.
Możesz przeczytać więcej na temat mojego artykułu Java Integer Cache - Why Integer.valueOf (127) == Integer.valueOf (127) Is True .