• -128 ~ 127 까지는 캐싱이 된다.

    • -XX:AutoBoxCacheMax=<size> jvm 설정으로 127 보다 큰 정수로 캐싱 범위를 늘릴 수 있다. (-128 보다 작은 정수는 안되네.)
  • 캐싱이 되는 -128 ~ 127 범위 안

    • new 키워드를 사용하면 주소가 달라진다.
    • 나머지는 주소값이 같다.
    Integer a1 = 10;
    Integer a2 = 10;
    a1 == a2 // true // new Integer(), Integer.valueOf() 하고 비교해도 다 true
    
    Integer a3 = new Integer(10);
    Integer a4 = new Integer(10);
    a3 == a4 // false // Integer, Integer.valueOf() 하고 비교해도 다 fase  
    
    Integer a5 = Integer.valueOf(10);
    Integer a6 = Integer.valueOf(10);
    a5 == a6 // true // Integer 하고 비교하면 true, new Integer() 하고 비교하면 false
  • 캐싱이 안되는 -128 ~ 127 범위 밖

    • new 키워드를 사용하면 주소가 달라진다.
    • 나머지도 다 주소값이 다르다.
      • 전부 내부적으로 new Integer() 를 호출하고 있다. (프리머티브 타입은 컴파일러가 자동으로 오토박싱하면서 생성해 준다.)
    • 위에 a1 == a2 // true 근데 b1 == b2 // false
      • 컴파일러가 자동으로 new Integer() 를 생성해 주는건 같은데 a는 캐싱이 되서 주소값이 같고 b는 캐싱이 안되서 주소값이 다르다.
    Integer b1 = 300; // 컴파일러가 자동으로 new Integer(300);
    Integer b2 = 300;
    Integer b3 = new Integer(300); 
    Integer b4 = new Integer(300);
    Integer b5 = Integer.valueOf(300); // Integer valueOf()에서 return new Integer(i);
    Integer b6 = Integer.valueOf(300); 
    // Integer, new Integer(), Integer.valueOf() 전부 new Integer() 호출하니 뭘 잡아서 서로 비교하든 다 fasle
  • Primitive Data Types

    • 프리머티브 타입과 == 연산자로 비교하면 모두 true가 나온다.
    • 프리머티브 타입에 == 연산자를 사용하면 주소값(compares object references) 비교가 아니라 값(compares values of the type) 비교가 된다고 한다.
    int a7 = 10;
    int b7 = 300;
    
    a7 == a3 // true (a1 ~ a7 뭘 넣어도 true가 나온다. 값을 비교하니깐.)
    b7 == b3 // true (b1 ~ b7 뭘 넣어도 true가 나온다. 값 비교니 캐싱하고도 상관없다.)
private static class IntegerCache {
  static final int low = -128;
  static final int high;
  static final Integer cache[];

  static {
    // high value may be configured by property
    int h = 127;
    String integerCacheHighPropValue =
      sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
    if (integerCacheHighPropValue != null) {
      try {
        int i = parseInt(integerCacheHighPropValue);
        i = Math.max(i, 127);
        // Maximum array size is Integer.MAX_VALUE
        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
      } catch( NumberFormatException nfe) {
        // If the property cannot be parsed into an int, ignore it.
      }
    }
    high = h;

    cache = new Integer[(high - low) + 1];
    int j = low;
    for(int k = 0; k < cache.length; k++)
      cache[k] = new Integer(j++);

    // range [-128, 127] must be interned (JLS7 5.1.7)
    assert IntegerCache.high >= 127;
  }

  private IntegerCache() {}
}
public static Integer valueOf(int i) {
  if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
  return new Integer(i);
}
public Integer(int value) {
  this.value = value;
}