String Değişmezliği ve String Havuzu
String'lerin neden değişmez olduğunu, string havuzunun nasıl çalıştığını ve == ile equals arasında ne zaman seçim yapılacağını anlayın.
String Değişmezliği ve String Havuzu, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
String Değişmezliği ve String Havuzu
String nesneleri Java'da değişmezdir. Değişmezliği, String havuzunu ve referans eşitliği ile değer eşitliği arasındaki farkı anlamak, ince hataları önler.
String'ler Neden Değişmezdir
String nesneleri oluşturulduktan sonra değiştirilemez. Bir String'i "değiştiren" her işlem aslında yeni bir String nesnesi oluşturur. Bu durum sharing, iş parçacığı güvenliği ve hashCode önbelleğe almayı mümkün kılar.
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); // HELLOString Havuzu (Havuza Alma)
String sabitleri String Havuzu'nda (öbek belleğinin özel bir bölümünde) saklanır. İçeriği aynı olan iki sabit, aynı nesneyi paylaşır.
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)== ve equals() Karşılaştırması
String içeriğini karşılaştırmak için her zaman .equals() kullanın. == işleci, iki değişkenin aynı nesneyi gösterip göstermediğini denetler (referans eşitliği).
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(): Bir String'i Elle Havuza Alma
String.intern(), bir String'i zorla havuza ekler ve havuzdaki referansı döndürür. Modern Java'da buna nadiren ihtiyaç duyulur.
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 stringsString Birleştirme Davranışı
+ ile birleştirme yeni String nesneleri oluşturur. Bir döngünün içinde bu işlem O(n²) karmaşıklığına sahiptir. Derleyici tek ifadeleri iyileştirir, ancak döngü tabanlı birleştirmeyi iyileştirmez.
// 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); // abcdString'leri Doğru Karşılaştırma
Her zaman equals() kullanın; büyük/küçük harfe duyarsız karşılaştırma için equalsIgnoreCase() kullanın. Leksikografik sıralama için compareTo() kullanın.
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)String hashCode Değerini Önbelleğe Alma
String'ler değişmez olduğundan Java, ilk çağrıdan sonra hashCode değerini önbelleğe alır. Sonraki çağrılar önbelleğe alınan değeri döndürür; bu da String'leri HashMap anahtarları olarak çok verimli kılar.
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 Finaldir
String sınıfı final olduğundan alt sınıflara ayrılamaz. Bu, hiçbir alt sınıfın değişmezliği veya hashCode tutarlılığını bozmayacağını garanti eder.
// 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 ve Birleştirme
Birden fazla parçadan oluşan String'ler için açıklık ve daha kolay yerelleştirme sağladığından birleştirme yerine String.format() veya metin bloklarını tercih edin.
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.5Null Güvenli String İşlemleri
String işlemlerinin çoğu, String null ise NPE fırlatır. Null değerini güvenli biçimde işlemek için savunmacı kalıplar veya String.valueOf() kullanın.
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"Hızlı Kontrol
Aşağıdaki kod ne yazdırır?
String a = "hello";
String b = new String("hello");
System.out.println(a.equals(b));
System.out.println(a == b);Özet: String Değişmezliği ve String Havuzu
Temel çıkarımlar:
- String'ler değişmezdir; işlemler özgün String'i hiçbir zaman değiştirmez, yeni String nesneleri döndürür
- String sabitleri havuza alınır; içeriği aynı olan iki sabit tek bir nesneyi paylaşır
- String içeriğini karşılaştırmak için her zaman .equals() kullanın; == nesne referanslarını karşılaştırır
- Büyük/küçük harfe duyarsız karşılaştırmalar için equalsIgnoreCase() kullanın
- Döngülerde String birleştirme O(n²) maliyetine sahiptir; verimlilik için StringBuilder kullanın
- String'ler hashCode değerlerini önbelleğe alır; bu da onları HashMap anahtarları olarak verimli ve güvenli kılar
Sıkça Sorulan Sorular
“String Değişmezliği ve String Havuzu” dersi ücretsiz mi?
Evet — “String Değişmezliği ve String Havuzu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“String Değişmezliği ve String Havuzu” dersinde ne öğreneceğim?
String'lerin neden değişmez olduğunu, string havuzunun nasıl çalıştığını ve == ile equals arasında ne zaman seçim yapılacağını anlayın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“String Değişmezliği ve String Havuzu” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- String Değişmezliği ve String Havuzu
- Verimli Birleştirme için StringBuilder
- Metin Blokları ve String.format
- Pattern ve Matcher ile Düzenli İfadeler