- String : Imutable & thread-safe
- StringBuffer : Mutable & thread-safe (synchronize keyword)
- StringBuilder : Mutable
Java 9 버전부터 문자열을 저장하는 배열의 타입이 변경되었다.
// 기존 private final char value[]; // 변경 후 private final byte[] value
기본 char형은 UTF-16기반의 2byte를 참조한다. 때문에 영어만 있어도 2byte를 차지한다.
변경 후 문자열에 따라 Latin-1(1byte)와 UTF-16(2byte)로 나누어 지기 때문에, String이 차지하는 메모리공간이 절약되었다.
(참고)
String str = "Hello";
str = str.concat(" Android");
(이전 "Hello"의 주소는 GC로 회수된다.)
StringBuilder str = new StringBuilder("Hello");
str.append(" Android");
🙋♀️문자열 연산속도가 빠른것은?
StringBuilder > StringBuffer >> String
🙋♀️String은 어떻게 참조가 될까요?
Call by value로 참조가 된다?
🙋♀️String은 Call by Reference인데 왜 pool을 참조하는 String 값이 변경될 때 같이 변경되지 않을까?
🙌 String은 immutable하기 때문에 pool 내의 값을 변경하는게 아니라, 새로운 값을 생성한다.
👀 String에서 + 연산의 동작?
Java 5 이전 : StringBuffer 로 컴파일됨(아니라는 글도 있음??)
Java 6 이후 : StringBuilder 로 컴파일됨런타임시 동적으로 문자열을 변경할 경우 String보다는 Buffer나 Builder사용(반복루프에서는 builder를 매번 새로 생성해서 성능이 좋지 못함.)