StringBuffer vs StringBuilder (Feat. Constant Pool)

이상민·2021년 8월 2일
0

[오늘의 배움]

목록 보기
58/70
post-thumbnail

1. Constant Pool

자바는 문자열들을 constant pool을 통해 관리한다

  • 따라서 다음과 같은 코드는 CP에 "0", "01", ... "012345" 같은 별개의 문자열을 생성한다
String a = "";
for (int i = 0; i <= 5; i++) {
    a += i
}
  • CP를 사용해 이미 존재하는 문자열의 경우 그대로 사용하기 때문에 다음과 같은 결과도 나온다
String a = "Hello";
String b = "Hello";
System.out.println(a == b);  // true, 레퍼런스의 비교
  • 따라서 여러 문자열을 합칠때 더하기 연산을 사용하지 말고, StringBuffer나 StringBuilder 같은 클래스를 사용해서 버퍼에 추가하고 이후 문자열을 생성하도록 해야한다

StringBuffer vs StringBuilder

두 클래스의 기본 사용법은 같다

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를 사용하면된다


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

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글