자바는 문자열들을 constant pool을 통해 관리한다
String a = "";
for (int i = 0; i <= 5; i++) {
a += i
}
String a = "Hello";
String b = "Hello";
System.out.println(a == b); // true, 레퍼런스의 비교
두 클래스의 기본 사용법은 같다
StringBuffer sb = new StringBuffer();
for (int i = 0; i <= 5; i++) {
sb.append(i)
}
System.out.println(sb);
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= 5; i++) {
sb.append(i);
}
System.out.println(sb);
두 클래스 모두 문자열을 constant pool에 바로 생성하지 않고 버퍼에 우선 합치게하는 기능을 한다
둘의 가장 큰 차이점은 StringBuffer는 thread-safe한 반면 StringBuilder는 그렇지 못하다는 것이다
StringBuffer : 동기화되어 있어 여러 프로세스/스레드에서 접근해도 안전하다
StringBuilder : 동기화되지 않아 속도가 StringBuffer보다 더 빠르다
동기화가 필요하다면 StringBuffer, 필요 없다면 StringBuilder를 사용하면된다
자연스럽게, 그렇다면 도대체 문자열(즉 CP에 들어가는 데이터)는 언제 생성되는지 궁금해졌다
위 클래스들은 사용하는 것으로는 전혀 문자열을 생성하지 않는다
StringBuffer/StringBuilder 클래스에 내장된 toString() 메소드를 호출할 때 비로소 문자열이 생성된다
Difference between StringBuilder and StringBuffer : https://stackoverflow.com/questions/355089/difference-between-stringbuilder-and-stringbuffer
When does StringBuffer adds strings to the String Pool? : https://stackoverflow.com/questions/15746018/when-does-stringbuffer-adds-strings-to-the-string-pool