1. 개요
이 짧은 기사에서는 Java에서 StringBuilder 와 StringBuffer의 유사점과 차이점을 살펴보겠습니다 .
간단히 말해서 StringBuilder 는 Java 1.5에서 StringBuffer를 대체하기 위해 도입되었습니다 .
2. 유사점
StringBuilder 와 StringBuffer는 모두 변경 가능한 문자 시퀀스를 보유하는 개체를 만듭니다. 이것이 어떻게 작동하는지, 그리고 이것이 불변의 String 클래스 와 어떻게 비교되는지 봅시다 :
String immutable = "abc";
immutable = immutable + "def";
"def" 를 추가하여 동일한 객체를 수정하는 것처럼 보일 수 있지만 String 인스턴스는 수정할 수 없기 때문에 새 객체를 생성합니다 .
중 하나를 사용하는 경우 StringBuffer를 또는 모두 StringBuilder를, 우리가 사용할 수 있습니다 APPEND () 메소드를 :
StringBuffer sb = new StringBuffer("abc");
sb.append("def");
이 경우 새 개체가 생성되지 않았습니다. sb 인스턴스 에서 append() 메서드를 호출 하고 내용을 수정했습니다. StringBuffer 및 StringBuilder 는 변경 가능한 개체입니다.
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 에서 찾을 수 있습니다 .