public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
  1. 공통점 : AbstractStringBuilder 추상클래스와 Serializable, CharSequence 인터페이스를 상속한다.
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence {

    /* ... */

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
}
public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence {

    /* ... */

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
}
  1. 차이점 : StringBuffer의 메서드들에는 synchronized 키워드가 붙는다. (thread-safe)

  2. 특징

  • 단일 스레드 환경에서 synchronized 는 불필요한 연산이기 때문에 성능저하를 일으킨다.

  • String 클래스의 immutable 속성때문에 배열(value 변수)을 사용한 AbstractStringBuilder 가 메모리 공간 활용에 효율적이다.

(참고: https://www.baeldung.com/java-string-immutable)

  • 하지만 문자열을 반복해서 붙이는 경우가 아니면 + 연산이나 String.concat() 메서드가 더 효율적이다.

(참고: http://www.simpleisbest.net/post/2013/04/24/Review-StringBuilder.aspx)

  • Buffer 필터 스트림과 StringBuilder를 같이 사용한다면 입출력 성능을 더 향상시킬 수 있다.