String 클래스는 불변의 속성을 가진다. 예를 들어, 문자열 더하기 연산을 수행했을 때 기존에 값이 들어있던 메모리 영역을 제거하고, 이어 붙인 문자열을 담은 새로운 값을 새로운 메모리 영역에 할당하여 이를 가리키도록 변경한다. 즉, 문자열 수정 시 String 인스턴스가 새로 생성된 것이다.
불변하므로, 동기화에 대해 신경쓰지 않아도 되고(Thread-Safe), 내부 데이터를 자유롭게 공유할 수 있다.
⇒ String의 단점을 해결하고자 가변성을 가진 StringBuilder, StringBuffer 클래스가 탄생하였다. append(), delete() 등의 멤버함수가 내장되어 있어, 해당 API를 통해 동일 객체 내 문자열 변경이 가능하다. (두 클래스는 동일한 API를 가지고 있다.)
동기화 키워드를 지원하여 멀티쓰레드 환경에서 안정적으로 사용이 가능하다. 따라서 쓰레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 일부가 쓰레드에 안전한지 모르는 경우에 사용하면 좋다.
동기화를 지원하지 않아 단일쓰레드 환경에 적합하며, 성능이 가장 좋다. 이는 쓰레드에 안전한지 여부가 전혀 관계 없는 프로그램 개발 시에 사용하면 좋다.
*단순히 성능만으로 보면, 연산이 많은 상황에서 StringBuilder > StringBuffer >>> String 순으로 성능이 좋다.