127까지는 true로 잘 떨어지지만 그 이상이 되면 == 연산의 결과는 동일하지 않다는 판단이 내려진다.
Integer 클래스의 소스를 살펴보면 IntegerCache라는 inner class가 존재하는데 거기에 보면 이유가 밝혀져 있다.
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
즉 -128~127까지는 cache를 이용해서 비교해준다고 한다. 그래서 128 부터는 == 은 동작하지 않았던 것이다.
다시 한번 기본으로 돌아가자!! 기본형 비교는 ==, 객체형 비교는 equals.. Wrapper 타입은 기본형이 아니다. 객체형이다.
더 많은 캐싱을 위해서는
더 많은 범위에서 캐싱을 하고 싶다면 위 주석대로 AutoBoxCacheMax의 값을 VM 옵션에 주면 된다.