ProgramlamaJava Geliştirici

Java'da dizelerle çalışma özelliklerini tanımlayın; String/StringBuilder/StringBuffer nasıl çalışır, ne zaman kullanılmalı ve bunların uygulanmasıyla ilgili hangi tuzaklar vardır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Değiştirilemeyen dizelerin aşırı birleştirilmesi bellek sızıntısına ve performans düşüşüne neden olabilir.
  • String.intern() çok sayıda benzersiz dize olduğunda PermGen/Metaspace'te OutOfMemoryError'a neden olabilir.
  • Çoklu iş parçacıklı senaryolarda StringBuilder'ın yanlış kullanımı yarış koşullarına yol açabilir.

Soru hilesi.

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); }

Konuyla ilgili ince detayları bilmemek sonucu oluşmuş gerçek hata örnekleri.


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.