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:AutoBoxCacheMaxJVM 옵션 으로 제어 할 수 있습니다 .
정수 우리는 또한이 Integer.IntegerCache과 유사한 개체 만이 캐싱 동작은 적용되지 않습니다 ByteCache, ShortCache, LongCache, CharacterCache에 대한 Byte, Short, Long, Character각각.
내 기사 Java Integer Cache-Why Integer.valueOf (127) == Integer.valueOf (127) Is True에서 더 많은 것을 읽을 수 있습니다 .