String — immutable. StringBuilder — mutable, fast, single-threaded. StringBuffer — mutable, thread-safe, slower.
Analogy: String = printed book (can't edit). StringBuilder = whiteboard (edit freely). StringBuffer = whiteboard with lock (safe but slow).
String:
1String s = "Hello";2s = s + " World"; // New object created34// BAD in loops:5String result = "";6for (int i = 0; i < 10000; i++) {7 result += i + " "; // O(n^2) — very slow!8}
StringBuilder:
1StringBuilder sb = new StringBuilder();2sb.append("Hello");3sb.append(" World");4String result = sb.toString();56// Good in loops:7StringBuilder sb2 = new StringBuilder();8for (int i = 0; i < 10000; i++) {9 sb2.append(i).append(" ");10}11String result2 = sb2.toString(); // O(n) — fast!1213sb.insert(5, " "); // Insert14sb.delete(0, 6); // Delete15sb.reverse(); // Reverse16sb.charAt(0); // Access17sb.length(); // Length18sb.capacity(); // Capacity
StringBuffer:
1StringBuffer sbf = new StringBuffer();2sbf.append("Hello");3sbf.append(" World");4String result = sbf.toString();56// Thread-safe shared buffer:7class SharedBuffer {8 private StringBuffer buffer = new StringBuffer();9 public synchronized void add(String msg) {10 buffer.append(msg).append("\n");11 }12 public String build() { return buffer.toString(); }13}
Performance: String concat in loops: SLOW. StringBuilder: FASTEST. StringBuffer: slower but safe.
When to use: String = constants. StringBuilder = loops (99% of cases). StringBuffer = multi-threaded (rare).