Java String, StringBuilder ve StringBuffer Farkları

İngilizce'ye Geç

Java String, StringBuilder ve StringBuffer Arasındaki Farklar

Kısa Özet: String, StringBuilder ve StringBuffer Farkı Nedir?

String sınıfı immutable (değiştirilemez) yapıda olduğu için her değişiklikte bellekte yeni bir nesne üretir. Metin birleştirme işlemleri çok fazlaysa performans düşer. Bunun yerine mutable (değiştirilebilir) olan sınıflar tercih edilmelidir: Tek thread (iş parçacığı) ortamında en hızlı çalışan StringBuilder, multi-thread (çoklu iş parçacığı) senaryolarında ise thread-safe (güvenli) çalışan StringBuffer kullanılmalıdır.

Bu yazıda Java String (immutable), StringBuilder (hızlı, non-synchronized) ve StringBuffer (thread-safe, synchronized) sınıflarını; String pool, bellek yönetimi, performans farkları ve en çok kullanılan önemli metotlar üzerinden detaylıca inceleyeceğiz.

İlgili İçerik: Henüz Java geliştirme ortamınızı kurmadıysanız, Ubuntu'ya Java JDK Nasıl Yüklenir? rehberimize göz atarak sisteminizi kodlamaya hazır hale getirebilirsiniz.

1. String Sınıfı Nedir? (Immutable)

Java String sınıfı immutable (değiştirilemez) bir nesnedir. Yani bellekte bir String oluşturulduktan sonra içeriği asla değişmez. "Değişiyormuş" gibi görünmesinin sebebi, aslında her metin ekleme işleminde bellekte (Heap) yepyeni bir String nesnesi üretilmesidir.

String s = "abc";
s.concat("def"); // Sonucu bir değişkene atamadığımız için kaybolur
System.out.println(s); // abc (Orijinal değer değişmedi)

String s2 = "abc";
s2 = s2.concat("def"); // Yeni üretilen değer "s2" referansına atanır
System.out.println(s2); // abcdef

2. String Sınıfının Özellikleri ve Neden final?

  • Değişmezdir: String içeriği sonradan düzenlenemez, bu da bellek sızıntılarını önler.
  • Unicode Destekler: Java’da karakterler 16-bit Unicode olarak ele alınır, böylece farklı diller desteklenir.
  • Bir Nesnedir: İlkel (primitive) bir tip değil, sınıftır. İsterseniz new String() ile de oluşturabilirsiniz.
  • Sınıf final'dır: Kimse String sınıfını extends edip davranışlarını (override) bozamaz. Bu, Java'nın çekirdek güvenliğini sağlar.

3. Java String Pool (Sabit Havuzu) ve Bellek Yönetimi

Java, aynı değere sahip String’leri tekrar tekrar üretip belleği şişirmemek için String Pool adı verilen özel bir alan kullanır. Derleyici bir String literal (Örn: "abc") gördüğünde, havuzda aynı değerin var olup olmadığını kontrol eder. Varsa, yeni nesne üretmek yerine doğrudan mevcut referansı gösterir.

String s1 = "abc";
String s2 = "abc";
// s1 ve s2 bellekte aynı adresi (String Pool'daki tek nesneyi) işaret eder.

String s3 = new String("abc"); 
// 'new' kullanıldığı için Pool kontrol edilmez, doğrudan Heap'te yeni nesne yaratılır!

Kritik Nokta: String’lerin immutable olması işte bu yüzden zorunludur. Eğer "abc" değeri değiştirilebilir olsaydı, s1 referansının yaptığı değişiklik s2'yi de etkiler ve sistem çökerdi.

4. Önemli String Metotları (En Çok Kullanılanlar)

charAt(), length() ve equalsIgnoreCase()

String kelime = "airplane";
System.out.println(kelime.charAt(2)); // r
System.out.println(kelime.length()); // 8

String x = "Exit";
System.out.println(x.equalsIgnoreCase("EXIT")); // true

substring(), replace() ve trim()

String numbers = "0123456789";
System.out.println(numbers.substring(5));    // "56789"
System.out.println(numbers.substring(5, 8)); // "567"

String bosluklu = "  Merhaba  ";
System.out.println(bosluklu.trim()); // "Merhaba" (Baştaki/sondaki boşluğu siler)

5. StringBuilder ve StringBuffer Nedir?

Eğer bir döngü içerisinde binlerce kez metin birleştirme, ekleme-çıkarma ve düzenleme işlemi yapacaksanız String kullanmak bellek kâbusu yaratır. Bu tür yoğun modifikasyonlar için StringBuilder veya StringBuffer kullanmak çok daha performanslıdır.

Çünkü bu sınıflar mutable (değiştirilebilir) yapıdadır; her seferinde yeni nesne üretmek yerine mevcut bellek alanı (kapasitesi) üzerinde değişiklik yaparlar.

6. StringBuilder vs StringBuffer Farkları

  • StringBuilder: Senkronize değildir (non-synchronized). Birden fazla thread aynı anda erişebilir. Bloklama mekanizması olmadığı için en hızlısıdır.
  • StringBuffer: Senkronizedir (synchronized). Metotları kilitlidir, yani aynı anda sadece tek bir thread işlem yapabilir. Thread-safe'tir ama hız açısından daha yavaştır.
// Thread-Safe kullanım örneği
StringBuffer sbf = new StringBuffer("abc");
sbf.append("def");
System.out.println(sbf); // abcdef

// Maksimum performans örneği
StringBuilder sbb = new StringBuilder("abc");
sbb.append("def").reverse().insert(3, "-");
System.out.println(sbb); // fed-cba

7. Ne Zaman Hangisini Kullanmalı?

  • Az sayıda değişiklik varsa: Basit işlemlerde ve API yanıtlarında okunabilirlik için String yeterlidir.
  • Tek thread, çok işlem varsa: Standart kodlamada ve yerel değişkenlerde maksimum performans için StringBuilder kullanılmalıdır.
  • Multi-thread (Çoklu İş Parçacığı): Aynı metin nesnesine farklı thread'ler eşzamanlı veri yazacaksa güvenlik için StringBuffer seçilmelidir.

8. Builder/Buffer Ortak Metotlar

StringBuilder sb = new StringBuilder("0123456789");

// Ekleme (Append)
sb.append(" - Bitti"); // 0123456789 - Bitti

// Silme (Delete)
sb.delete(4, 6); // 4 ve 5. indeksleri siler.

// Araya Sıkıştırma (Insert)
sb.insert(4, "X");

// Ters Çevirme (Reverse)
sb.reverse();

// Metni String'e Çevirme (toString)
String finalMetin = sb.toString();

9. Sık Sorulan Sorular (FAQ)

String neden immutable (değiştirilemez) yapılmıştır?

String'in değişmez olması Hash tabanlı koleksiyonlarda (HashMap) güvenlik sağlar, String Pool optimizasyonunu mümkün kılar ve çoklu thread mimarilerinde (Thread-Safety) veri çakışmasını engeller.

String birleştirirken (+) operatörü mü, StringBuilder mı?

Java 8 ve sonrasında basit String birleştirme (+) işlemleri arka planda derleyici tarafından otomatik olarak StringBuilder'a dönüştürülür. Ancak bir for veya while döngüsü içerisinde birleştirme yapıyorsanız mutlaka manuel olarak StringBuilder.append() kullanmalısınız.

StringBuffer ne zaman gerekli olur?

Aynı metin nesnesine birden fazla thread'in (iş parçacığının) aynı anda erişip değişiklik yapması gereken sunucu (server-side) işlemlerinde veri kaybını önlemek için thread-safe olan StringBuffer kullanılır.

Sonuç

Bu yazımızda Java'nın en çok kullanılan veri tiplerinden String'in perde arkasındaki çalışma mantığını (String Pool ve Immutable) kavradık. Yoğun metin işlemlerinde donanımı yormamak adına StringBuilder ve StringBuffer gibi esnek sınıfları ne zaman seçeceğinizi öğrenmeniz, yazılım kalitenizi bir üst seviyeye taşıyacaktır.

Etiketler: java string nedir, stringbuilder vs stringbuffer, string immutable, java string pool, java performans

Son Güncelleme: 2026

Latest Software Developers - Yazılım Blog Yazarı Profil Resmi

Yazar

LatestSoftwareDevelopers

Güncel yazılım teknolojilerinin takip edildiği blog.

Java ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *