Java의 StringBuilder 대 StringBuffer

1. 개요

이 짧은 기사에서는 Java에서 StringBuilderStringBuffer의 유사점과 차이점을 살펴볼 것 입니다.

간단히 말해, 모두 StringBuilder는 대체 자바 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에서 찾을 수 있습니다.