public static void main(String[] args) {

    Integer numOne = 126;
    Integer numTwo = 126;

    System.out.println(numOne == numTwo);

    Integer numThree = 128;
    Integer numFour = 128;

		System.out.println(numThree == numFour);

}

별다른 설정 없이 위 코드를 실행하면 결과값은 다음과 같이 나옵니다.

true
false

그 이유는, Integer 클래스가 내부에서 캐싱을 사용해 동일한 객체를(주소) 반환하기 때문입니다.

primitive typeint 의 값 비교와는 다릅니다.

Integer class 내부에는, Integer Cache 클래스가 존재합니다.

자주 요청되는 값은 캐싱(Cache)하여 공간 및 시간 성능을 훨씬 더 나은 수준으로 가능성이 높기 때문입니다.

별도의 설정이 존재하지 않는한 Integer.valueOf(int i) 메서드는 항상 -128에서 127까지의 범위에 있는 값을 캐시하고 이 범위 밖의 다른 값도 캐시할 수 있습니다.

Integer Cache 범위의 설정 방법은 다음과 같습니다.

XX:AutoBoxCacheMax

Byte, Short, Long, Character등의 Wrapper type 클래스들도 내부에 Cache 클래스가 구현되어 있으나, Integer 클래스처럼 Cache 범위를 조절할 수 없다고 합니다.