String — immutable. StringBuilder — mutable, fast. StringBuffer — mutable, thread-safe.
Analogy: String = printed book (immutable). StringBuilder = whiteboard (fast edits). StringBuffer = locked whiteboard (safe but slow).
String:
1String s = "Hello";2s = s + " World"; // New object34// BAD in loops:5String r = "";6for (int i = 0; i < 10000; i++) {7 r += i + " "; // O(n^2)8}910// GOOD:11StringBuilder sb = new StringBuilder();12for (int i = 0; i < 10000; i++) {13 sb.append(i).append(" ");14}15String r2 = sb.toString(); // O(n)
StringBuilder:
1StringBuilder sb = new StringBuilder();2sb.append("Hello");3sb.append(" ");4sb.append("World");5String result = sb.toString();67sb.insert(5, " ");8sb.delete(0, 6);9sb.reverse();10sb.charAt(0);11sb.length();12sb.capacity();1314// Pre-size:15new StringBuilder(10000);
StringBuffer:
1StringBuffer sbf = new StringBuffer();2sbf.append("Hello");3sbf.append(" World");4String result = sbf.toString();56// Thread-safe:7class Log {8 private StringBuffer buf = new StringBuffer();9 public void add(String msg) { buf.append(msg).append("\n"); }10 public String get() { return buf.toString(); }11}
Performance: String loops: SLOW. StringBuilder: FASTEST. StringBuffer: slower but safe.
Use: String = constants. StringBuilder = loops. StringBuffer = multi-threaded (rare).