Java에서 숫자 리터럴을 컴파일하고이를 정수 (capital I
)에 지정하면 컴파일러에서 다음을 생성합니다.
Integer b2 =Integer.valueOf(127)
이 코드 줄은 오토 박싱을 사용할 때도 생성됩니다.
valueOf
특정 숫자가 "풀링"되도록 구현되고 128보다 작은 값에 대해 동일한 인스턴스를 반환합니다.
Java 1.6 소스 코드에서 621 행 :
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
값 high
캔 시스템 특성과 다른 값으로 설정 될 수있다.
-Djava.lang.Integer.IntegerCache.high = 999
해당 시스템 속성으로 프로그램을 실행하면 true로 출력됩니다!
명백한 결론 : 두 개의 참조가 동일하다고 절대 의존하지 말고 항상 .equals()
메소드 와 비교하십시오 .
따라서 b2.equals(b3)
논리적으로 동일한 모든 b2, b3 값에 대해 true를 인쇄합니다.
Integer
캐시는 성능상의 이유가 아니라 JLS 섹션 5.1.7 을 준수 한다는 점에 유의하십시오 . -128에서 127 사이의 값에 대해 개체 ID를 제공해야합니다.
Integer # valueOf (int) 도이 동작을 문서화합니다.
이 방법은 자주 요청되는 값을 캐싱하여 공간 및 시간 성능을 크게 향상시킬 수 있습니다. 이 방법은 항상 -128에서 127 사이의 값을 캐시하며이 범위 밖의 다른 값을 캐시 할 수 있습니다.