String name = "haeni";
String name1 = "haeni";
""을 이용하여 문자열을 생성한다.String 값이 Heap 영역 내 String Constant Pool(String Pool)에 저장된다.String Constant Pool 내의 동일한 객체를 바라본다.
Java 7버전 이전에는Perm영역에서 관리되었으나,Java 7부터String Constant Pool은Perm영역에서Heap영역으로 옮겨졌다.Heap영역은GC대상으로String Constant Pool에서 참조를 잃은 문자열 객체들은 다시 메모리로 반환처리 된다.
String name2 = new String("haeni");
String name3 = new String("haeni");
new 연산자로 문자열을 생성한다.Heap 영역에 저장된다.Heap에서 서로 다른 객체를 만들고 바라본다.intern() 메서드로 등록하면 new 연산자를 통해 문자열을 생성하더라도 String Pool에 등록된다.💡 불변성의 장점을 위해
String Literal을 이용해서 String을 생성하는 것이 좋다.
== : 두 객체가 동일한 객체인지 주소값을 비교한다.equals() : 두 객체의 값 자체를 비교한다.
String literal로 생성한 경우, 동일한 값을 갖는 String은 같은 메모리를 참조할 수 있기 때문에 메모리를 절약할 수 있다.String이 불변이 아니었다면, 해당 메모리에 값이 언제 바뀔지 알 수 없기 때문에 String pool 형태로 관리할 수 없다.Thread-safe하다.String을 수정하는 대신 String Constant Pool에 새 문자열이 생성된다.String의 hashcode는 생성 단계부터 캐싱하기 때문에, 쓰일 때마다 매번 계산되지 않는다.HashMap의 경우, 다른 객체를 Key로 했을 때보다 String을 Key로 했을 때 더 빠른 속도로 사용할 수 있다.💡 Q.
Map의Key값을Object가 아닌String으로 선언하는 이유는 ?
->Key가 잘못 참조되는 것을 방지할 수 있음
String 클래스는 불변하지만 StringBuilder, StringBuffer 클래스는 변할 수 있다.StringBuilder, StringBuffer 클래스는 연산시 주소의 변경 없이 기존 객체의 공간이 부족하게 되면 기존 버퍼의 크기를 증가 시키면서 새로운 문자열을 더한다.String 클래스 보다 StringBuilder, StringBuffer 클래스가 성능이 나은 편이다.StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전(thread-safe)하다.StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않다.StringBuffer보다 StringBuilder가 뛰어나다.[Java] 불변 객체(Immutable Object)와 final
String Constant Pool이란? | Java String Pool
문자열은 불변한다(String is Immutable)
Java String 객체와 String 리터럴
String은 왜, 어떻게 불변 객체인가요? String Constant Pool