1. 개요

이 짧은 기사에서는 Java에서 StringBuilderStringBuffer의 유사점과 차이점을 살펴보겠습니다 .

간단히 말해서 StringBuilder 는 Java 1.5에서 StringBuffer를 대체하기 위해 도입되었습니다 .

2. 유사점

StringBuilderStringBuffer는 모두 변경 가능한 문자 시퀀스를 보유하는 개체를 만듭니다. 이것이 어떻게 작동하는지, 그리고 이것이 불변의 String 클래스 와 어떻게 비교되는지 봅시다 :

String immutable = "abc";
immutable = immutable + "def";

"def" 를 추가하여 동일한 객체를 수정하는 것처럼 보일 수 있지만 String 인스턴스는 수정할 수 없기 때문에 새 객체를 생성합니다 .

중 하나를 사용하는 경우 StringBuffer를 또는 모두 StringBuilder를, 우리가 사용할 수 있습니다 APPEND () 메소드를 :

StringBuffer sb = new StringBuffer("abc");
sb.append("def");

이 경우 새 개체가 생성되지 않았습니다. sb 인스턴스 에서 append() 메서드를 호출 하고 내용을 수정했습니다. StringBufferStringBuilder 는 변경 가능한 개체입니다.

3. 차이점

StringBuffer 는 동기화되어 스레드로부터 안전합니다. StringBuilder StringBuffer API와 호환되지만 동기화는 보장되지 않습니다.

스레드로부터 안전한 구현이 아니기 때문에 더 빠르며 스레드로부터 안전할 필요가 없는 곳에서 사용하는 것이 좋습니다.

3.1. 성능

작은 반복에서는 성능 차이가 미미합니다. JMH를 사용 하여 간단한 마이크로 벤치마크를 수행해 보겠습니다 .

@State(Scope.Benchmark)
public static class MyState {
    int iterations = 1000;
    String initial = "abc";
    String suffix = "def";
}

@Benchmark
public StringBuffer benchmarkStringBuffer(MyState state) {
    StringBuffer stringBuffer = new StringBuffer(state.initial);
    for (int i = 0; i < state.iterations; i++) {
        stringBuffer.append(state.suffix);
    }
    return stringBuffer;
}

@Benchmark
public StringBuilder benchmarkStringBuilder(MyState state) {
    StringBuilder stringBuilder = new StringBuilder(state.initial);
    for (int i = 0; i < state.iterations; i++) {
        stringBuilder.append(state.suffix);
    }
    return stringBuilder;
}

기본 처리량 모드(즉, 단위 시간당 작업(점수가 높을수록 좋음))를 사용하여 다음을 제공합니다.

Benchmark                                          Mode  Cnt      Score      Error  Units
StringBufferStringBuilder.benchmarkStringBuffer   thrpt  200  86169.834 ±  972.477  ops/s
StringBufferStringBuilder.benchmarkStringBuilder  thrpt  200  91076.952 ± 2818.028  ops/s

반복 횟수를 1k에서 1m으로 늘리면 다음을 얻습니다.

Benchmark                                          Mode  Cnt   Score   Error  Units
StringBufferStringBuilder.benchmarkStringBuffer   thrpt  200  77.178 ± 0.898  ops/s
StringBufferStringBuilder.benchmarkStringBuilder  thrpt  200  85.769 ± 1.966  ops/s

그러나 이것은 응용 프로그램의 실제 실제 성능에 실제 영향을 미칠 수도 있고 그렇지 않을 수도 있는 마이크로 벤치마크라는 점을 염두에 두십시오.

4. 결론

간단히 말해서 StringBuffer 는 스레드로부터 안전한 구현이므로 StringBuilder 보다 느립니다 .

단일 스레드 프로그램에서는 StringBuilder 를 사용할 수 있습니다 . 그러나 StringBuffer에 대한 StringBuilder 의 성능 향상은 모든 곳에서 교체하는 것을 정당화하기에는 너무 작을 수 있습니다. 하나의 구현을 다른 구현으로 대체하기 위한 작업을 수행하기 전에 항상 응용 프로그램을 프로파일링하고 런타임 성능 특성을 이해하는 것이 좋습니다.

마지막으로 항상 그렇듯이 토론 중에 사용된 코드 는 GitHub 에서 찾을 수 있습니다 .

Junit footer banner