반응형
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));
}
반응형
'Java' 카테고리의 다른 글
[Java] 내 이미지는 왜 압축이 되었는가? (3) | 2024.11.07 |
---|---|
Spring의 탄생배경 (0) | 2024.07.06 |
Java는 왜 Call By Value인가? (2) | 2024.01.04 |
[Spring]외장톰캣 특정 war 미로드 (0) | 2023.10.22 |
[Spring]PageRequest이용한 페이징처리 (0) | 2023.08.15 |