Skip to main content

3.2 String vs StringBuilder vs StringBuffer

← Back to Chapter 3: Strings in Java

When manipulating text in performance-critical loops, choosing the correct String abstraction prevents massive Heap memory churn and GC pressure.


StringBuilder​

For repeated String modification, use StringBuilder.

StringBuilder sb = new StringBuilder();

sb.append("Java");
sb.append(" ");
sb.append("Developer");

System.out.println(sb.toString());

Output:

Java Developer

Unlike String, StringBuilder is mutable.

That means its existing object can be modified.

StringBuffer​

StringBuffer is also mutable.

StringBuffer sb = new StringBuffer();

sb.append("Java");
sb.append(" Developer");

System.out.println(sb);

Major Differences​

FeatureStringStringBuilderStringBuffer
MutabilityImmutable (new instance on change)Mutable (modifies internal buffer)Mutable (modifies internal buffer)
Thread SafetyYes (Inherently thread-safe)No (Unsynchronized)Yes (synchronized methods)
PerformanceSlow for repeated concatenationFastest (Zero lock overhead)Slower due to synchronization locks
IntroducedJava 1.0Java 5Java 1.0
Primary Use CaseConstants, DTOs, Maps, APIsLocal text assembly, loopsMultithreaded shared string building

String vs StringBuilder vs StringBuffer​

Remember this simple rule:

Need an unchanging String?
↓
String

Need to modify String frequently?
↓
StringBuilder

Need mutable String + synchronized operations?
↓
StringBuffer

when thread safety isn't required.

StringBuilder > StringBuffer

when thread safety is required.

StringBuffer > StringBuilder