본문 바로가기

Java

[JAVA]Reference Type Cache 기능

반응형

Integer,Long,Double 등의 Reference Type에는 자체적으로 값에 대한 캐싱 기능이 지원됨 String 타입은 좀 다름.

타입별로 최소값, 최대값이 설정되어 있음

    @IntrinsicCandidate
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
  • 해당 소스에서는 IntegerCache값이 캐싱범위를 의미(-128~127)
@Test
    void IntegerCache동작테스트() {
        /**
         * IntegerCache의 범위는 -128~127
         */
        Integer trueNum = 127;
        Integer trueNum1 = 127;
        Assertions.assertEquals(System.identityHashCode(trueNum), System.identityHashCode(trueNum1));
        // 캐싱하지않음
        Integer falseNum = 128;
        Integer falseNum1 = 128;
        Assertions.assertNotEquals(System.identityHashCode(falseNum), System.identityHashCode(falseNum1));
    }

 

String 타입의 Reference Type Cache 

Tip

  • String 은 Immutable(불변성)
  • String은 원시타입(Primitive Type)이 없음

new 연산자를 이용한 방식(Java Heap에 존재)

String test= new String("test");

리터럴을 이용한 방식(Heap영역 안에 String constant pool에 존재)

String test="test";

String Interning

리터럴을 이용해 생성할 경우 내부적으로 String.inern() 메소드를 호출(native 메소드로 코드확인X)

  • 주어진 문자열이 String Constant Pool에 존재하는지 확인
    • 해당 문자열이 Pool에 존재한다면 기존 주소값 사용
    • 없다면 String Constant Pool에 저장 후 새로운 주소값으로 저장

Test

@Test
    void 문자열캐싱테스트() {
        String literalStr = "문자열";
        String literalStr1 = "문자열";
        assertEquals(System.identityHashCode(literalStr), System.identityHashCode(literalStr1));
        String heapStr = new String("문자열");
        String heapStr1 = new String("문자열");
        assertNotEquals(System.identityHashCode(heapStr), System.identityHashCode(heapStr1));
    }
반응형