Java String işlemleri, kullanıcı adlarından rapor metinlerine kadar karakter dizilerini oluşturmayı, incelemeyi ve dönüştürmeyi sağlar. String metni temsil eden temel yapıdır; StringBuilder ise metnin sık sık değiştirildiği durumlarda daha uygun olan değiştirilebilir bir yapı sunar.
Başlangıç düzeyinde en önemli ayrım şudur: Sabit veya az değişen metinlerde String yeterlidir; çok sayıda ekleme ve silme yapılan metinlerde ise StringBuilder değerlendirilebilir. Önce temel String oluşturma ve karşılaştırma mantığını öğrenmek, doğru aracı seçmenin temelidir.
Java’da String Nasıl Oluşturulur ve Temel Metotlar Nasıl Kullanılır?
Java’da bir metin çoğunlukla String literal kullanılarak oluşturulur:
String kullaniciAdi = " BerkKeskin ";
String rapor = new String("Başarılı işlem");
İlk satır, günlük kullanım için tercih edilen kısa yazımdır. new String(...) de geçerli bir yaklaşımdır; ancak çoğu durumda gereksiz nesne oluşturabileceği için metin sabitlerini tanımlarken literal kullanım daha anlaşılırdır.
Bir kullanıcı adını normalleştirirken önce baştaki ve sondaki boşluklar trim() ile temizlenebilir. Ardından toLowerCase() veya toUpperCase() ile harf biçimi standartlaştırılır. Bu dönüşümler yeni bir String üretir; mevcut metin doğrudan değiştirilmez.
length(): Metindeki karakter sayısını verir.charAt(index): Belirtilen konumdaki karakteri döndürür.substring(baslangic, bitis): Belirtilen aralıktaki parçayı alır; bitiş indeksi dahil değildir.contains("metin"): Metnin belirli bir ifadeyi içerip içermediğini kontrol eder.indexOf("metin"): İfadenin ilk bulunduğu indeksi verir; bulunamazsa-1döner.replace("eski", "yeni"): Eşleşen metin parçalarını değiştirir.split("ayırıcı"): Metni parçalara böler ve birString[]dizisi üretir.
Örneğin bir raporun ilk kelimesini almak için split(" ") kullanılabilir. charAt() ve substring() indeksleri sıfırdan başlar. Geçersiz bir indeks kullanmak hata oluşturabileceğinden, metnin uzunluğu ve parçanın gerçekten bulunup bulunmadığı kontrol edilmelidir.
public class StringOrnek {
public static void main(String[] args) {
String kullanici = " BerkKeskin ";
String rapor = "Sonuç: Java sınavı başarılı";
String temizAd = kullanici.trim().toLowerCase();
String ilkKelime = rapor.substring(0, rapor.indexOf(":"));
System.out.println(temizAd);
System.out.println(ilkKelime);
System.out.println(rapor.contains("başarılı"));
}
}
Beklenen çıktı şöyledir:
berkkeskin
Sonuç
true
Büyük-küçük harf dönüşümleri karşılaştırmayı etkiler. "Java".equals("java") sonucu false olur. Kullanıcı girdilerinde harf biçiminin önemsiz olması isteniyorsa karşılaştırmadan önce iki metin aynı biçime dönüştürülebilir. Java bilginizi ölçmek için Java bilgi testi üzerinden özellikle metotlar ve nesne karşılaştırmalarıyla ilgili seviyenizi kontrol edebilirsiniz.
String Karşılaştırmasında == ve equals Neden Farklıdır?

== operatörü iki String nesnesinin içeriğini değil, aynı nesneyi gösterip göstermediğini kontrol eder. Metinlerin karakter karakter aynı olup olmadığını anlamak için equals() kullanılmalıdır.
String a = "java";
String b = "java";
String c = new String("java");
System.out.println(a == b); // true olabilir
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true
Aynı içerikteki literal metinler String Pool adı verilen ortak havuz mantığıyla ilişkilendirilebilir. Bu nedenle bazı literal değişkenler aynı nesneyi gösterebilir. Ancak bu davranış, == operatörünü içerik karşılaştırması için güvenilir hâle getirmez; nesnenin nasıl oluşturulduğu sonucu değiştirebilir.
| Yaklaşım | Karşılaştırdığı şey | String için kullanım |
|---|---|---|
== |
Nesne referansı | İçerik kontrolü için tercih edilmez |
equals() |
Metin içeriği | Genellikle doğru tercihtir |
Objects.equals() |
İçerik ve null durumu | İki değer de null olabilirken kullanışlıdır |
Beklenen metnin null olmayacağı biliniyorsa beklenenMetin.equals(gelenMetin) biçimi güvenlidir; çünkü null olan taraf gelen değer olsa bile çağrı beklenen metin üzerinde yapılır. Her iki değişkenin de null olabileceği durumlarda Objects.equals(beklenenMetin, gelenMetin) daha güvenli bir seçenektir.
String Immutable Yapıdadır: Değişiklikler Nasıl Gerçekleşir?
Java’da String immutable bir yapıdadır; yani oluşturulmuş bir String nesnesinin içeriği sonradan doğrudan değiştirilemez. trim(), replace() ve toUpperCase() gibi metotlar mevcut nesneyi dönüştürmek yerine işlem sonucunu içeren yeni bir String döndürür.
Bu nedenle metot sonucunu yeni bir değişkene atamak gerekir. Aşağıdaki örnekte kullanıcı adının başındaki ve sonundaki boşluklar temizlenir, ardından büyük harfe çevrilir:
String kullaniciAdi = " berk_keskin ";
String temizAd = kullaniciAdi.trim();
String buyukAd = temizAd.toUpperCase();
String raporBasligi = "Rapor: " + buyukAd;
System.out.println("İlk değer: " + kullaniciAdi);
System.out.println("Rapor başlığı: " + raporBasligi);
Beklenen çıktı, ilk String’in değişmediğini ve işlemlerin yeni sonuçlar oluşturduğunu gösterir:
İlk değer: berk_keskin
Rapor başlığı: Rapor: BERK_KESKIN
Örneğin yalnızca kullaniciAdi.trim(); yazarsanız ekrandaki değer değişmez. Çünkü dönen yeni String’i hiçbir değişkene atamamış olursunuz. Doğru kullanım kullaniciAdi = kullaniciAdi.trim(); şeklindedir. Yeni sonuç, önceki değerle aynı içeriğe sahip olabilir veya farklı bir içeriğe dönüşebilir; önemli nokta, mevcut String nesnesinin içeriğinin yerinde değiştirilmemesidir.
String Pool da bu davranışla ilişkilidir. Java, kaynak kodundaki aynı String literal değerlerini bir havuzda paylaşabilir. Örneğin iki değişkene doğrudan aynı literal atanırsa JVM bunları havuzdaki ortak nesneyle ilişkilendirebilir. Bu paylaşım, String’lerin değiştirilemez olması sayesinde güvenlidir; bir kod parçası diğer değişkenin metnini farkında olmadan değiştiremez. String Pool, otomatik ve dikkatli kullanılması gereken bir bellek yönetimi mekanizmasıdır; her durumda kesin bir performans garantisi olarak değerlendirilmemelidir. Ayrıntılar için Java String API dokümantasyonu incelenebilir.
- Metot sonucunu yeni bir değişkene atadım mı?
- Metin karşılaştırırken
==yerineequals()kullandım mı? - İndeks kullanan işlemlerde sınırları kontrol ettim mi?
- Değerin
nullolma ihtimalini değerlendirdim mi?
StringBuilder Metotlarıyla Değiştirilebilir Metin Nasıl Üretilir?

Rapor, log veya uzun bir çıktı metni adım adım oluşturulacaksa StringBuilder kullanılabilir. StringBuilder üzerinde yapılan append(), insert(), delete() ve reverse() işlemleri aynı builder’ın içeriği üzerinde ilerler.
public class Main {
public static void main(String[] args) {
StringBuilder rapor = new StringBuilder("Rapor");
rapor.append(": Java");
rapor.insert(5, " 2026");
rapor.append(" - taslak");
int baslangic = rapor.indexOf(" - taslak");
rapor.delete(baslangic, baslangic + 9);
rapor.append(" | Bölüm 1");
rapor.reverse();
String sonuc = rapor.toString();
System.out.println(sonuc);
}
}
Beklenen çıktı şöyledir:
1 mülöB | avaJ :6202 ropaR
Burada append() raporun sonuna bölüm ekler, insert() “2026” bilgisini belirli bir konuma yerleştirir, delete() gereksiz “taslak” ifadesini kaldırır ve reverse() tüm karakter dizisini ters çevirir. Son adımda toString(), builder içeriğini normal bir String değerine dönüştürür. Java StringBuilder API dokümantasyonu bu metotların indeks kurallarını ve dönüş değerlerini açıklar.
Az sayıda metin birleştirme işleminde + operatörü daha okunaklı olabilir: "Rapor: " + baslik. Buna karşılık metin döngü içinde veya çok sayıda adımla kuruluyorsa, değişikliklerin aynı StringBuilder üzerinde sürdürülmesi daha uygun bir tasarım olabilir. StringBuilder her durumda zorunlu değildir.
StringBuffer da değiştirilebilir metin yaklaşımı sunar. Ancak seçim yapılırken uygulamanın aynı metin nesnesine eşzamanlı erişim gerektirip gerektirmediği ayrıca değerlendirilmelidir. Bu karar, kullanılan yapının iş parçacıklarıyla nasıl paylaşılacağına bağlıdır.
String mi, + mı, StringBuilder mı? Doğru Seçim Nasıl Yapılır?
Java’da metin oluştururken tek bir “en iyi” yöntem yoktur. Az sayıda parçayı okunabilir biçimde birleştiriyorsanız String ve + operatörü çoğu zaman yeterlidir. Metin parçaları bir döngü içinde art arda ekleniyor veya aynı metin üzerinde insert, delete ve reverse gibi işlemler yapılıyorsa StringBuilder daha uygun bir tasarım seçeneği olabilir.
| Senaryo | Uygun tercih | Gerekçe |
|---|---|---|
| Kısa bir mesajı birkaç parçayla oluşturma | String veya + | Okunabilirlik yüksektir ve yapı basittir. |
| Bir kullanıcı adını temizleyip saklama | String | Sonuç üzerinde çok sayıda ardışık değişiklik yapılmaz. |
| Döngü içinde rapor satırlarını biriktirme | StringBuilder | Metin tek bir değiştirilebilir yapı üzerinde oluşturulur. |
| Metnin ortasına ekleme veya belirli kısmını silme | StringBuilder | insert ve delete gibi metotlar doğrudan kullanılabilir. |
| Bir işlem tamamlandıktan sonra başka bir metoda metin gönderme | String veya StringBuilder.toString() | API’nin beklediği türe göre son değer hazırlanır. |
Üç adımlı karar çerçevesi
-
Metin değişecek mi? Metin oluşturulduktan sonra sabit kalacaksa String doğal tercihtir. Örneğin kullanıcıdan alınan kullanıcı adını
trimvetoLowerCaseişlemleriyle düzenleyip bir değişkende saklayabilirsiniz. Burada yapılan her işlem yeni bir String sonucu üretir; aynı String nesnesinin içeriği değiştirilmez. Metnin karakterleri üzerinde doğrudan değişiklik yapmanız gerekiyorsa StringBuilder değerlendirilebilir. -
Değişiklik veya birleştirme döngü içinde yoğun mu? Birkaç parçayı
+ile birleştirmek anlaşılırdır:"Merhaba " + kullaniciAdigibi. Ancak yüzlerce rapor satırını bir döngüde sırayla eklemek, metin üretiminin yapısını daha dikkatli seçmeyi gerektirir. Bu durumdaappendkullanan bir StringBuilder, tüm parçaları tek bir değiştirilebilir metin yapısında toplar. Yine de her kısa birleştirmeyi otomatik olarak StringBuilder’a dönüştürmek gerekmez. -
Sonuç başka bir API’ye String olarak mı aktarılacak? Dosyaya yazma, ekrana basma veya bir metodun parametresine gönderme aşamasında ilgili API’nin beklediği türe bakın. Bir StringBuilder’ın son metin değerini almak için
toString()kullanılır. Böylece üretim aşamasında StringBuilder’dan, tamamlanmış sonuç aşamasında String’den yararlanabilirsiniz. Java API’sinde StringBuilder;append,insert,deletevereversegibi metin düzenleme işlemleri sunar. ([docs.oracle.com](https://docs.oracle.com/en/java/javase/26/docs/api/java.base/java/lang/StringBuilder.html?utm_source=openai))
Rapor satırları senaryosunda uygulama
Bir programın üç farklı rapor satırını birleştirdiğini düşünelim. Her satır önceden hazır ve yalnızca bir kez ekleniyorsa + ile yazılmış kısa bir ifade okunabilir olabilir. Fakat satırlar bir listedeki kayıtlar üzerinden döngüyle üretiliyorsa StringBuilder daha anlamlıdır:
StringBuilder rapor = new StringBuilder();
rapor.append("Kullanıcı: ayse.kaya ");
rapor.append("Durum: Aktif ");
rapor.append("Son işlem: Başarılı");
String sonuc = rapor.toString();
System.out.println(sonuc);
Bu örnekte raporun üretim aşamasında StringBuilder kullanılır; başka bir metoda gönderilebilecek son değer ise toString() ile String’e çevrilir. Java öğrenme sürecinde bu tür seçimleri yalnızca sözdizimiyle değil, veri akışını düşünerek yapmak önemlidir. Bu temeli uygulamalı biçimde geliştirmek isteyenler birebir Java özel ders programını inceleyebilir.
Yaygın String ve StringBuilder Hataları: Kontrol Listesi
Aşağıdaki kontrol listesi, metin işlemleri sırasında karşılaşılan hataları belirti, neden ve düzeltme ilişkisiyle teşhis etmenize yardımcı olur.
-
Belirti: İçeriği aynı görünen iki String beklenmedik biçimde eşit çıkmıyor.
Neden: İçerik yerine nesne referanslarını karşılaştırmak için==kullanılmıştır.
Düzeltme: Metin içeriğini karşılaştırmak içinequalskullanın; olası null değerlerdeObjects.equalsgibi güvenli yaklaşımları değerlendirin. -
Belirti:
replaceveyatrimçağrısından sonra değişkenin değeri aynı kalıyor.
Neden: String immutable olduğu için bu metotlar mevcut nesneyi değiştirmez, yeni bir String döndürür.
Düzeltme: Sonucu yeniden atayın:kullaniciAdi = kullaniciAdi.trim(); -
Belirti: Program
charAtveyasubstringsatırında çalışma zamanı hatası veriyor.
Neden: İstenen indeks, String’in geçerli sınırlarının dışındadır.
Düzeltme: İndeksi kullanmadan öncelength()ile uzunluğu kontrol edin; başlangıç ve bitiş değerlerini dikkatle belirleyin. -
Belirti:
splitsonucunu doğrudan tek bir String gibi kullanmaya çalışıyorsunuz.
Neden:split, parçalanmış metinleri String dizisi olarak döndürür.
Düzeltme: SonucuString[]değişkenine atayın ve elemanlara indeks veya döngü ile erişin. -
Belirti: StringBuilder ile oluşturulan metin başka bir metoda gönderilemiyor.
Neden: Metodu çağıran kod String bekliyor, ancak StringBuilder nesnesi aktarılıyor.
Düzeltme: Göndermeden öncebuilder.toString()kullanın. -
Belirti: Döngünün her turunda yeni bir StringBuilder oluşturuluyor.
Neden: Biriktirilecek yapı döngünün içinde yeniden başlatılıyor.
Düzeltme: StringBuilder’ı ihtiyaç varsa döngüden önce oluşturun ve döngü içinde aynı nesneyeappenduygulayın. -
Belirti: Birkaç basit metin birleştirmesi gereksiz yere karmaşıklaştırılıyor.
Neden: StringBuilder her metin işleminde zorunlu çözüm gibi görülüyor.
Düzeltme: İşlem kısa ve tek seferlikse String veya+kullanın; seçimi kodun okunabilirliği ve değişiklik yoğunluğu belirlesin.
Kendinizi denemek için küçük bir uygulama görevi oluşturun: Kullanıcıdan alınan adı temizleyip kullanıcı adı hâline getirin, üç rapor satırını birleştirin ve sonucu ekrana yazdırın. Kullanıcı adını düzenleyen satırda String’in hangi nedenle uygun olduğunu, rapor satırlarını biriktiren bölümde StringBuilder gerekip gerekmediğini ve ekrana yazdırmadan önce toString() çağrısının gerekli olup olmadığını açıklayın.
Sık Sorulan Sorular
Java’da String karşılaştırırken neden == yerine equals kullanılmalıdır?
== iki değişkenin aynı nesneye referans verip vermediğini kontrol eder. equals ise String içeriklerini karşılaştırır. Bu nedenle kullanıcı adı, parola dışındaki metin alanları veya komut gibi değerlerin içeriğini karşılaştırırken genellikle equals tercih edilmelidir.
String immutable olduğu için replace veya toUpperCase işlemlerinin sonucu nereye gider?
Bu metotlar yeni bir String üretir ve sonuç, metot çağrısının dönüş değeri olarak gelir. Sonucu kullanmak için yeni bir değişkene atayabilir veya mevcut değişkene yeniden bağlayabilirsiniz. Atama yapılmazsa dönen yeni değer kullanılmadan kalır.
StringBuilder hangi durumlarda String kullanımından daha uygun olur?
Metin bir döngüde çok sayıda parçadan oluşturuluyorsa veya aynı metin üzerinde ekleme, silme ve ters çevirme gibi işlemler yapılıyorsa StringBuilder daha uygun olabilir. Birkaç kısa ve sabit birleştirmede ise String veya + daha okunabilir bir seçimdir.
StringBuilder ile StringBuffer arasındaki temel fark nedir?
İkisi de değiştirilebilir karakter dizileriyle çalışır ve benzer metotlar sunar. StringBuilder eşzamanlama garantisi sağlamaz; StringBuffer ise metotlarını eşzamanlı kullanıma uygun olacak şekilde senkronize eder. Tek iş parçacıklı olağan metin üretiminde StringBuilder, birden fazla iş parçacığının aynı nesneyi paylaşması gereken durumlarda ise kullanım koşulları ayrıca değerlendirilmelidir.
Doğru seçim, StringBuilder’ı her yerde kullanmak değil; metnin ne kadar değişeceğini, işlemlerin nasıl tekrarlandığını ve sonucun hangi türe ihtiyaç duyduğunu birlikte değerlendirmektir.