Di Java, objek String tidak dapat diubah — setelah dibuat, isinya tidak pernah dapat berubah. Operasi apa pun yang terlihat memodifikasi String sebenarnya membuat String yang baru. Untuk modifikasi berulang yang efisien, gunakan StringBuilder sebagai gantinya.
Strings tidak dapat diubah
String s = "Hello";
s.concat(" World"); // returns a NEW string; `s` is unchanged
System.out.println(s); // "Hello" — the original is untouched
s = s + " World"; // creates a NEW string and rebinds s; old "Hello" is discarded
Metode seperti concat, toUpperCase, replace, dan substring semuanya mengembalikan objek String yang baru — yang asli tidak pernah dimodifikasi.
Mengapa ketidakmampuan perubahan? Manfaatnya
✓ Thread safety — immutable objects are safe to share across threads (no locking)
✓ String pool — identical string literals can be SHARED/reused (memory savings)
✓ Hashing/keys — safe as HashMap keys (hashCode can be cached, never changes)
✓ Security — strings used for filenames, URLs, credentials can't be altered
after a security check
Ketidakmampuan perubahan membuat Strings secara inheren thread-safe, memungkinkan JVM untuk intern (berbagi) literal melalui String pool, dan membuatnya dapat diandalkan sebagai kunci peta (hash mereka tidak pernah berubah).
Masalah kinerja: penggabungan string dalam loop
// ❌ creates a NEW string object on EVERY iteration — O(n²), wasteful
String result = "";
for (int i = 0; i < 10000; i++) {
result += i; // each += allocates a whole new string
}
Karena setiap += membuat String baru (menyalin semua konten sebelumnya), membangun string dalam loop adalah kuadratik dan menghasilkan banyak sampah.
StringBuilder — string mutable yang efisien
// ✅ StringBuilder mutates an internal buffer — O(n), efficient
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i); // modifies the buffer in place, no new objects
}
String result = sb.toString(); // convert to a String once, at the end
StringBuilder adalah urutan karakter yang dapat diubah — append/insert/delete memodifikasi buffer internalnya tanpa membuat objek baru, membuat pembangunan berbasis loop efisien. (StringBuffer adalah varian yang thread-safe tetapi lebih lambat.)
Mengapa ini penting
Ketidakmampuan perubahan String adalah karakteristik Java yang menentukan dengan konsekuensi penting: memberikan keamanan thread, memungkinkan String pool yang menghemat memori, dan membuat Strings dapat diandalkan sebagai kunci peta dan dalam konteks keamanan — tetapi juga berarti penggabungan string naif dalam loop adalah masalah kinerja yang nyata (O(n²), sampah berlebihan).
Mengetahui kapan harus menggunakan StringBuilder untuk modifikasi berulang adalah keharusan praktis yang berasal langsung dari pemahaman ketidakmampuan perubahan.
Kombinasi ini — mengapa Strings tidak dapat diubah (keamanan, berbagi, hash) dan kapan beralih ke StringBuilder (penggabungan dalam loop) — adalah topik wawancara umum dan perbaikan kinerja dunia nyata yang sering terjadi.
