Imutabilitas String dan String Pool
Pahami alasan String tidak dapat diubah, cara kerja string pool, serta kapan menggunakan == dibandingkan equals.
Imutabilitas String dan String Pool adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Kekekalan String dan Kumpulan String
String bersifat tidak dapat diubah di Java. Memahami sifat tidak dapat diubah, kumpulan String, serta kesetaraan referensi dan kesetaraan nilai membantu mencegah kesalahan tersembunyi.
Mengapa String Tidak Dapat Diubah
Objek String tidak dapat diubah setelah dibuat. Operasi apa pun yang "mengubah" String sebenarnya membuat objek String baru. Hal ini memungkinkan sharing, keamanan thread, dan penyimpanan cache hashCode.
String s = "hello";
s.toUpperCase(); // creates a new String, does NOT modify s
System.out.println(s); // still "hello"
String upper = s.toUpperCase(); // must capture the result
System.out.println(upper); // HELLOKumpulan String (Interning)
Literal String disimpan di Kumpulan String (bagian khusus dari tumpukan memori). Dua literal dengan isi yang sama menggunakan objek yang sama.
String a = "hello"; // goes into pool
String b = "hello"; // same object from pool
String c = new String("hello"); // forces new object outside pool
System.out.println(a == b); // true (same pool reference)
System.out.println(a == c); // false (different objects)
System.out.println(a.equals(c)); // true (same content)== vs equals()
Selalu gunakan .equals() untuk membandingkan isi String. Operator == memeriksa apakah dua variabel menunjuk ke objek yang sama (kesetaraan referensi).
String input = new String("admin"); // from user input, not pooled
String role = "admin";
// Dangerous: fails because different objects
if (input == role) System.out.println("Same"); // not printed!
// Correct: compares content
if (input.equals(role)) System.out.println("Equal!"); // prints
// Null-safe: put constant first to avoid NPE
if ("admin".equals(input)) System.out.println("Admin"); // printsintern(): Memasukkan String ke Kumpulan Secara Manual
String.intern() memaksa String masuk ke kumpulan dan mengembalikan referensi yang ada di kumpulan. Dalam Java modern, hal ini jarang diperlukan.
String s1 = new String("interned");
String s2 = s1.intern();
String s3 = "interned"; // already in pool
System.out.println(s2 == s3); // true (both point to pool)
System.out.println(s1 == s3); // false (s1 is off-pool)
// Modern use: prefer String.intern() only when you need
// identity-based caching with thousands of repeated stringsPerilaku Penggabungan String
Penggabungan dengan + membuat objek String baru. Di dalam perulangan, operasi ini memiliki kompleksitas O(n²). Kompiler mengoptimalkan ekspresi tunggal, tetapi tidak mengoptimalkan penggabungan berbasis perulangan.
// Compiler optimizes this to a StringBuilder automatically:
String result = "Hello, " + "World" + "!";
// In loops: compiler does NOT optimize — use StringBuilder explicitly!
List<String> words = List.of("a", "b", "c", "d");
String bad = ""; // O(n^2) — new object each iteration
for (String w : words) bad += w;
StringBuilder sb = new StringBuilder();
for (String w : words) sb.append(w); // O(n) — efficient
String good = sb.toString();
System.out.println(good); // abcdMembandingkan String dengan Benar
Selalu gunakan equals(); untuk perbandingan tanpa memperhatikan huruf besar-kecil, gunakan equalsIgnoreCase(). Gunakan compareTo() untuk pengurutan leksikografis.
String a = "Java";
String b = "java";
System.out.println(a.equals(b)); // false
System.out.println(a.equalsIgnoreCase(b)); // true
System.out.println(a.compareToIgnoreCase(b)); // 0 (equal)
System.out.println(a.compareTo(b)); // negative (J < j in Unicode)Penyimpanan Cache Hashcode String
Karena String tidak dapat diubah, Java menyimpan hashCode di cache setelah pemanggilan pertama. Pemanggilan berikutnya mengembalikan nilai yang tersimpan di cache, sehingga String sangat efisien sebagai kunci HashMap.
String key = "product:12345";
// hashCode computed once and cached:
int h1 = key.hashCode();
int h2 = key.hashCode(); // returns cached value
System.out.println(h1 == h2); // true
// Strings are ideal HashMap keys because:
// 1. hashCode is consistent (immutable content)
// 2. hashCode is cached (fast repeated lookups)
// 3. equals is well-defined (content-based)
Map<String, Integer> map = new HashMap<>();
map.put("key", 42);
System.out.println(map.get("key")); // 42String Bersifat Final
Kelas String bersifat final—kelas ini tidak dapat diturunkan. Hal ini menjamin bahwa tidak ada subkelas yang dapat merusak sifat tidak dapat diubah atau konsistensi hashCode.
// String is final — this will not compile:
// class MutableString extends String {} // compile error
// You cannot override String behavior.
// If you need custom string-like behavior, use a wrapper:
record ProductSku(String value) {
ProductSku { if (!value.matches("[A-Z]{3}-[0-9]{4}")) throw new IllegalArgumentException(); }
@Override public String toString() { return value; }
}String.format vs Penggabungan
Untuk String yang terdiri dari banyak bagian, pilih String.format() atau blok teks daripada penggabungan agar lebih jelas dan lebih mudah dilokalkan.
String name = "Alice";
int age = 30;
double score = 97.5;
// Concatenation — harder to read with many parts
String bad = "User: " + name + ", Age: " + age + ", Score: " + score;
// String.format — clear placeholders
String good = String.format("User: %s, Age: %d, Score: %.1f", name, age, score);
System.out.println(good);
// User: Alice, Age: 30, Score: 97.5Operasi String yang Aman terhadap Nilai Null
Banyak operasi String melempar NPE jika String bernilai null. Gunakan pola defensif atau String.valueOf() untuk menangani null dengan aman.
String value = null;
// Null-safe length check
int len = (value != null) ? value.length() : 0;
System.out.println(len); // 0
// Null-safe comparison (put constant first)
boolean isAdmin = "admin".equals(value); // false, no NPE
// String.valueOf converts null to "null" string
System.out.println(String.valueOf(value)); // "null"
System.out.println(Objects.toString(value, "default")); // "default"Pemeriksaan Singkat
Apa yang dicetak oleh kode berikut?
String a = "hello";
String b = new String("hello");
System.out.println(a.equals(b));
System.out.println(a == b);Rangkuman: Kekekalan String dan Kumpulan String
Hal-hal penting:
- String tidak dapat diubah—operasi mengembalikan objek String baru dan tidak pernah mengubah objek asli
- Literal String disimpan dalam kumpulan—dua literal dengan isi yang sama menggunakan satu objek
- Selalu gunakan .equals() untuk membandingkan isi String; == membandingkan referensi objek
- Gunakan equalsIgnoreCase() untuk perbandingan tanpa memperhatikan huruf besar-kecil
- Penggabungan String dalam perulangan memiliki kompleksitas O(n²)—gunakan StringBuilder agar lebih efisien
- String menyimpan hashCode di cache, sehingga efisien dan aman digunakan sebagai kunci HashMap
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Imutabilitas String dan String Pool” gratis?
Ya — teks lengkap “Imutabilitas String dan String Pool” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Imutabilitas String dan String Pool”?
Pahami alasan String tidak dapat diubah, cara kerja string pool, serta kapan menggunakan == dibandingkan equals. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Imutabilitas String dan String Pool” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Imutabilitas String dan String Pool
- StringBuilder untuk Penggabungan Efisien
- Blok Teks dan String.format
- Ekspresi Reguler dengan Pattern dan Matcher