300 != 300

2073 단어 jdkcache
code:
  int value = 100; 
  Integer a = value; 
  Integer b = value; 
  System.out.println(a + "==" + b + " ? " + (a == b)); 

  value = 300; 
  a = value; 
  b = value; 
  System.out.println(a + "==" + b + " ? " + (a == b)); 
----------------------------------------------------------------------------- 
output: 
100==100 ? true 
300==300 ? false
----------------------------------------------------------------------------- 
decompile code: 
int value = 100; 
        Integer a = Integer.valueOf(value); 
        Integer b = Integer.valueOf(value); 
        System.out.println((new StringBuilder()).append(a).append("==").append(b).append(" ? ").append(a == b).toString()); 
        value = 300; 
        a = Integer.valueOf(value); 
        b = Integer.valueOf(value); 
        System.out.println((new StringBuilder()).append(a).append("==").append(b).append(" ? ").append(a == b).toString());

-----------------------------------------------------------------------------
JDK source:
public static Integer valueOf(int i) { 
        final int offset = 128; 
        if (i >= -128 && i <= 127) { // must cache 
            return IntegerCache.cache[i + offset]; 
        } 
        return new Integer(i); 
    }

-----------------------------------------------------------------------------
원래 1.5의 box와 unboxing 기능은 가면일 뿐이고 컴파일러는 결국 1.4의 규칙으로 실현되었다. 그러나 1.5의 Integer는public static Integer value Of(int i)의 함수를 추가했고 내부에서 -128에서 127 사이의 Integer 대상에 대한 캐시를 실현했다. 그 의도와Boolean.valueOf와 마찬가지로 너무 많은 창설 대상을 피합니다.앞으로 new Integer(××)코드가 나왔습니다. 모두 Integer를 사용해야 합니다.valueOf(××)의 방식.또한 StringBuilder의 세부 사항은 우리가 주의하는 바와 같이 1.5 도입 기능은 StringBuffer의 새로운 종류와 같다. 단지StringBuilder는 라인의 안전 상황을 고려하지 않는다. 보아하니 1.5는 효율에 대한 작은 세부 사항의 최적화가 적지 않은 것 같다. 심지어 인코딩 습관에 대한 수정도 주목할 만하다.

좋은 웹페이지 즐겨찾기