Java String, StringBuilder ve StringBuffer Nedir? Farkları, Performans ve Örnekler
String sınıfı nedir? (Immutable)
Java String sınıfı immutable (değiştirilemez) bir nesnedir. Yani bir String oluşturulduktan sonra içeriği asla değişmez. “Değişiyormuş” gibi görünmesinin sebebi, aslında her değişiklikte yeni bir String nesnesi üretilmesidir.
String s = "abc";
s.concat("def");
System.out.println(s); // abc (değişmedi)
String s = "abc";
s = s.concat("def");
System.out.println(s); // abcdef
String sınıfının özellikleri ve neden final?
- Değişmezdir: String içeriği sonradan düzenlenemez.
- Unicode destekler: Java’da karakterler 16-bit Unicode olarak ele alınır.
- String bir nesnedir: İsterseniz
newile de oluşturabilirsiniz. - String sınıfı final’dır: Metotların davranışı override edilmez; güvenilirlik ve güvenlik sağlar.
String a = new String("abcdef");
String b = "abcdef";
Java String Pool ve bellek yönetimi
Java, aynı değere sahip String’leri tekrar tekrar üretip belleği şişirmemek için
String Pool (String sabit havuzu) denen özel bir alan kullanır.
Derleyici bir String literal (ör. "abc") gördüğünde, havuzda aynı değer var mı diye kontrol eder.
Varsa yeni nesne üretmek yerine mevcut referansa yönlendirebilir.
String s1 = "abc";
String s2 = "abc";
// s1 ve s2 genellikle aynı literal havuzunu paylaşabilir
String’lerin immutable olması bu noktada kritik: Aynı String’i birden fazla referans paylaşıyorsa ve değiştirilebilir olsaydı, programın farklı yerlerinde beklenmeyen hatalar oluşabilirdi.
String’in önemli metotları (en çok kullanılanlar)
charAt(int index)
String x = "airplane";
System.out.println(x.charAt(2)); // r
concat(String s) ve +
String x = "taxi";
System.out.println(x.concat(" cab")); // taxi cab
String y = "library";
System.out.println(y + " card"); // library card
equalsIgnoreCase(String s)
String x = "Exit";
System.out.println(x.equalsIgnoreCase("EXIT")); // true
System.out.println(x.equalsIgnoreCase("tixe")); // false
length()
String x = "01234567";
System.out.println(x.length()); // 8
replace(char old, char nw)
String x = "oxoxoxox";
System.out.println(x.replace('x','X')); // oXoXoXoX
substring(begin, end)
String x = "0123456789";
System.out.println(x.substring(5)); // 56789
System.out.println(x.substring(5, 8)); // 567
toLowerCase() / toUpperCase()
String x = "A New Moon";
System.out.println(x.toLowerCase()); // a new moon
System.out.println(x.toUpperCase()); // A NEW MOON
trim()
String x = " hi ";
System.out.println(x.trim()); // "hi"
StringBuilder ve StringBuffer nedir?
Çok sayıda metin birleştirme, ekleme-çıkarma ve düzenleme işlemi yapacaksanız StringBuilder veya StringBuffer kullanmak daha performanslıdır. Çünkü bu sınıflar, String gibi her seferinde yeni nesne üretmek yerine aynı yapı üzerinde değişiklik yapabilir.
StringBuilder vs StringBuffer farkları
- StringBuilder: Senkronize değildir (non-synchronized). Genelde daha hızlıdır.
- StringBuffer: Senkronizedir (synchronized). Thread-safe kullanım için uygundur.
- API benzer: Metot isimleri büyük ölçüde aynıdır (
append,insert,delete,reverse...).
StringBuffer sbf = new StringBuffer("abc");
sbf.append("def");
System.out.println(sbf); // abcdef
StringBuilder sbb = new StringBuilder("abc");
sbb.append("def").reverse().insert(3, " - ");
System.out.println(sbb); // fed - cba
Ne zaman hangisini kullanmalı?
- Az sayıda değişiklik: Basit işlemlerde String yeterli (özellikle okunabilirlik için).
- Tek thread, çok işlem: Performans için genelde StringBuilder.
- Çok thread paylaşımlı yapı: Güvenlik için StringBuffer (thread-safe).
StringBuilder / StringBuffer önemli metotlar (örnekli)
append() — en çok kullanılan
StringBuffer sb = new StringBuffer("set ");
sb.append("point");
System.out.println(sb); // set point
StringBuffer sb2 = new StringBuffer("pi = ");
sb2.append(3.14159f);
System.out.println(sb2); // pi = 3.14159
delete(start, end)
StringBuilder sb = new StringBuilder("0123456789");
System.out.println(sb.delete(4, 6)); // 01236789
insert(offset, String s)
StringBuilder sb = new StringBuilder("01234567");
sb.insert(4, " - ");
System.out.println(sb); // 0123 - 4567
reverse()
StringBuffer sb = new StringBuffer("A man a plan a canal Panama");
sb.reverse();
System.out.println(sb); // amanaP lanac a nalp a nam A
toString()
StringBuffer sb = new StringBuffer("test string");
System.out.println(sb.toString()); // test string
Sık sorulan sorular (FAQ)
String neden immutable?
Güvenlik, String Pool optimizasyonu ve çoklu referans paylaşımında tutarlılık için String sınıfı değişmezdir.
StringBuilder neden daha hızlı?
Senkronizasyon maliyeti yoktur ve aynı nesne üzerinde değişiklik yapar; bu nedenle tek thread senaryosunda daha hızlıdır.
StringBuffer ne zaman gerekli?
Aynı metin nesnesine birden fazla thread erişip değişiklik yapacaksa thread-safe yapı gerektiği için tercih edilir.