String str="hello";
str=str+"world"; // [hello world]
새로운 영역을 가리키게 변경되고 처음 선언했던 hello로 값이 할당되어 있던 메모리 영역은 Garbage로 남아있다가 GC에 의해 사라지게 되는 것 --> 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성되는 것
변하지 않은 문자열을 저장할 때 적합
String이 불변이기 때문에 String Pool도 존재할 수 있다.
값이 같은 String은 String Pool내에서 String 객체를 공유하도록 한다. 공유를 하기 위해서는 String은 반드시 immutable
사용자의 이름이나 패스워드, 혹은 네트워크 연결을 위한 포트 번호나 connection URL 등 중요한 정보를 String으로 받을 때가 많다. JVM의 class loader가 class loading을 수행할때도 마찬가지
동기화
객체가 불변이면 멀티 쓰레드 환경에서도 값이 바뀔 위험 X
Hashcode Caching
참고 : https://starkying.tistory.com/entry/why-java-string-is-immutable
StringBuffer sb=new StringBuffer("hello");
sb.append(" world");
.append .delete등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는 것이 가능하다.
문자열의 추가, 수정, 삭제가 빈번하게 발생하는 경우
String : 문자열 연산이 적고 멀티쓰레드 환경
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경
StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않는 경우
스레드 안전은 멀티 쓰레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 쓰레드로 부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 쓰레드로부터 호출되어 실행 중일 때, 다른 쓰레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 쓰레드에서의 함수 수행결과가 올바르게 나오는 것