Study-Mornda / Effective-Java

'Effective Java 3/E' 스터디 저장소입니다.
3 stars 0 forks source link

[아이템 6-질문] 문자열 리터럴이 저장되는 String Constant Pool 개념 #28

Closed riyenas0925 closed 2 years ago

riyenas0925 commented 2 years ago

@kimhanui 코멘트

불필요한 문자열 인스턴스 생성을 피하기 위한 영역

내부적으로 String#intern 메서드를 호출하면서 해당문자열이 String Constant Pool에 존재하는지 확인 후 존재하면 그 주소값을 반환하고, 아니라면 String Constant Pool에 넣고 새로운 주소값을 반환합니다. Item6의 핵심인 불필요한 객체 생성을 피하기 위한 옵션 입니다.

String Constants Pool에 저장하고 사용하는 것을 String Interning 라고 합니다.

검증

s.intern()에서 s와 동등(equals)한 값이 Pool에 있다면 해당 주소를, 없다면 생성한 주소를 반환하는데 이미 변수 b 선언으로 pool에 값이 있어서 b==c는 true라는 결과가 나옵니다.

@DisplayName("이미 Pool에 값이 있다면 같은 주소를 바라본다.")
@Test
public void test2_1(){
    String s = new String("aaa");
    String b = "aaa";
    String c = s.intern();

    assertThat(b == c);
}

String Constant Pool 위치 변경

Java 버전에 따라 영역의 특징에 따라 String Constant Pool의 위치가 변경됐다고 합니다. Java 6이전

Java7부터

img

참고

https://starkying.tistory.com/entry/what-is-java-string-pool https://bbchu.tistory.com/13