기존 String클래스는 immutable클래스입니다. 하지만 StringBuffer클래스나 StringBuilder클래스의 경우 변경이 가능한 mutable클래스 입니다.
두 클래스에서 가장 큰 차이점은 멀티쓰레드 환경에서 안전한지 안전하지 않는지로 구분할 수 있습니다.
StringBuffer
StringBuffer는 Buffer를 가지고 있는 변경 가능한 String 클래스입니다.
StringBuffer sbSize = new StringBuffer(10);
StringBuffer sbString = new StringBuffer("Hello");
생성자
@HotSpotIntrinsicCandidate
public StringBuffer() {
super(16);
}
@HotSpotIntrinsicCandidate
public StringBuffer(int capacity) {
super(capacity);
}
Buffer를 가지고 있는 만큼 버퍼를 조정할 수 있습니다.
기본적으로 16의 사이즈를 가지고 있고 따로 지정 가능합니다.
@HotSpotIntrinsicCandidate
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
또한 문자열 자체를 파라미터로 제공할 수도 있습니다.
String과 다른 점이 있는데 StringBuffer의 경우 두 참조변수를 equals를 통해 비교를 하여도 다르게 나오는 것이다.
StringBuffer hello = new StringBuffer("Hello");
StringBuffer hi = new StringBuffer("Hello");
System.out.println(hello.equals(hi));

StringBuffer 클래스는 equals를 Override를 하지 않았기 때문에 두 변수를 ==로 비교하는 것과 같은 결과가 나옵니다.
또한 StringBuffer는 멀티쓰레드 환경에서 안전하다
StringBuilder
사용 방법의 경우 StringBuffer와 같습니다.
StringBuilder sb = new StringBuilder(10);
StringBuilder sbStr = new StringBuilder("Hello");
다른 점은 StringBuilder는 멀티쓰레드에 안전하지 않다.