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에서 더 많은 것을 읽을 수 있습니다 .