Java'da String sınıfı immutable (değiştirilemez): herhangi bir değişiklik işleminde yeni bir nesne oluşturulur. StringBuilder ve StringBuffer sınıfları değiştirilebilir, döngüler içinde birleştirme ve karmaşık dönüşümler için kullanılır.
Anahtar farklılıklar:
String: immutable, ek senkronizasyon olmaksızın thread-safe. Okunabilir, değişmeyen metinler için idealdir (örneğin, anahtarlar, mesajlar).StringBuilder: mutable, thread-safe değil, ancak hızlı birleştirme. Çok sayıda değişim olduğu yerlerde kullanılır.StringBuffer: mutable, thread-safe (metotlar senkronize edilmiştir), ancak StringBuilder'a göre performans bakımından daha düşüktür.Hız karşılaştırması örneği:
String s = ""; for (int i = 0; i < 10000; i++) { s += i; // her seferinde yeni bir String oluşturur, yavaş! } // Daha iyisi: StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString();
Tuzaklar:
String.intern() çok sayıda benzersiz dize olduğunda PermGen/Metaspace'te OutOfMemoryError'a neden olabilir.Soru: "Bir döngü içinde + operatörü ile dizelerin birleştirilmesi etkili midir?"
Cevap: Hayır, her seferinde yeni bir String nesnesi oluşturulur, bu da bellek ve GC üzerinde büyük bir yük oluşturur. Birçok işlem için StringBuilder veya StringBuffer (eğer thread-safe gerekiyorsa) kullanmak daha iyidir.
Örnek:
String s = ""; for (int i = 0; i < 1000; i++) { s += i; // ÇOK etkisiz! } // vs StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); }
Hikaye
Bir banka projesinde, büyük bir döngüde
+operatörü ile dizelerin birleştirilmesi gece analizini 15 kat yavaşlattı. Sorun, StringBuilder ile değiştirerek çözüldü; çalışma süresi 40 dakikadan 2 dakikaya düştü.
Hikaye
Genç bir geliştirici iş parçacıklarıyla ilgili bir hata yaptı ve aynı nesne-fasadında StringBuilder kullandı; bu nesneye aynı anda birden fazla iş parçacığı erişiyordu. Bu, senkronizasyon eksikliği nedeniyle rasgele hatalara ve yanlış sonuçlara yol açtı.
Hikaye
Bir projede String.intern() kullanılarak benzersiz etiketler oluşturuluyordu. Kullanıcı sayısındaki artışla birlikte, JVM OutOfMemoryError: PermGen space hatası vermeye başladı. Çözüm olarak intern() kullanımından vazgeçildi ve diğer önbellekleme mekanizmalarına geçildi.