포스팅에서 본 건데 외국에서는 자바 이해도에 관한 면접 질문으로 자주 묻는 듯 하다.
Integer a = 1000, b = 1000;
Integer c = 100, d = 100;
System.out.println(a == b);
System.out.println(c == d);
정답은 false, true이다. Integer 클래스 내부적으로 캐시가 동작했기 때문이다. 참고로 Integer 외의 Wrapper class는 캐시가 없다.
먼저 컴파일러가 a = 1000를 a = valueOf(1000)로 바꾸어 컴파일한다. new Integer()로 직접 생성하는 방법은 권장되지 않는다. doc에 다음과 같이 표시되어 있다. @Deprecated(since="9") . 이유는 앞으로 알아볼 valueOf(1000) 를 더 권장하기 때문이다.
doc에 이렇게 명시되어 있다.
코드는 다음과 같다.
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) //
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}