Java’da String ve Metodları
Java’da String, bir karakter dizisini temsil eden bir sınıftır. Gündelik programlamada isimler, cümleler, dosya yolları gibi metinsel her türlü veriyi depolamak ve üzerinde işlem yapmak için kullanılır.
String’lerin en önemli özelliği immutable (değişmez) olmalarıdır. Bu, bir String nesnesi bir kez oluşturulduğunda içeriğinin asla değiştirilemeyeceği anlamına gelir. Bir String üzerinde birleştirme, değiştirme veya kesme gibi bir işlem yaptığınızda, aslında orijinal String üzerinde bir değişiklik yapılmaz; bunun yerine, istenen değişiklikleri içeren yeni bir String nesnesi oluşturulur. Bu özellik, özellikle çoklu iş parçacıklı (multi-threaded) uygulamalarda String’leri güvenli (thread-safe) hale getirir.
Bir String oluşturmanın yaygın yolları şunlardır:
String greeting = "Merhaba Dünya"; // String literal
String name = new String("Ayşe"); // new anahtar kelimesiyleTemel String Metodları
String sınıfı, metinlerle çalışmak için zengin bir metod kütüphanesi sunar. İşte en sık kullanılan ve bilmeniz gerekenler:
length(): Bir String’deki karakter sayısını döndürür.
String text = "Java"; int uzunluk = text.length(); // 4isEmpty(): String'in boş olup olmadığını kontrol eder.
String str1 = ""; boolean bosMu = str1.isEmpty(); // truecharAt(int index): Belirtilen indeksteki karakteri döndürür (indeksler 0'dan başlar).
String kelime = "Hello"; char ilkHarf = kelime.charAt(0); // 'H'equals(Object anotherString)&equalsIgnoreCase(String anotherString): İki String'in içerik olarak eşit olup olmadığını kontrol eder.equals()büyük/küçük harf duyarlıdır,equalsIgnoreCase()ise değildir.
String s1 = "Java"; String s2 = "java";
boolean isEqual = s1.equals(s2); // false
boolean isEqualIgnore = s1.equalsIgnoreCase(s2); // trueDikkat: String'leri karşılaştırırken == operatörünü kullanmaktan kaçının. Bu operatör, nesnelerin bellek adreslerini karşılaştırır, içeriklerini değil.
concat(String str): İki String'i birleştirir.+operatörü de benzer işlev görür.
String ad = "Ali";
String soyad = "Can";
String adSoyad = ad.concat(" ").concat(soyad); // "Ali Can"substring(int beginIndex)&substring(int beginIndex, int endIndex): Bir String'in belirli bir bölümünü (alt dizesini) döndürür. endIndex dahil değildir.
String cumle = "Bu bir örnek.";
String parca = cumle.substring(7, 12); // "örnek"indexOf(String str)&lastIndexOf(String str): Bir alt dizenin ilk veya son geçtiği indeksi döndürür. Bulunamazsa -1 döndürür.
String metin = "elma,armut,elma";
int ilkElma = metin.indexOf("elma"); // 0
int sonElma = metin.lastIndexOf("elma"); // 10replace(char oldChar, char newChar)&replace(CharSequence target, CharSequence replacement): Belirli karakterleri veya karakter dizilerini değiştirir.
String orijinal = "Java";
String yeni = orijinal.replace('a', 'o'); // "Jovo"toLowerCase()&toUpperCase(): Tüm karakterleri küçük veya büyük harfe dönüştürür.
String mesaj = "Merhaba";
String kucuk = mesaj.toLowerCase(); // "merhaba"trim(): Bir String'in başındaki ve sonundaki boşlukları kaldırır.
String input = " test "; String trimmed = input.trim(); // "test"split(String regex): Bir String'i belirli bir ayırıcıya göre böler ve bir String dizisi döndürür.
String veri = "1,2,3";
String[] sayilar = veri.split(","); // {"1", "2", "3"}String, StringBuffer ve StringBuilder: Performans ve Güvenlik Farkları
String'lerin immutable yapısı, her değişiklikte yeni bir nesne oluşturulmasına neden olur. Az sayıda String işlemi yaparken bu bir sorun teşkil etmezken, çok sayıda metin manipülasyonu (özellikle döngüler içinde) bellek ve performans açısından verimsizliğe yol açabilir. İşte bu noktada StringBuffer ve StringBuilder devreye girer.
Get Mehmet Reşit Çağan’s stories in your inbox
Join Medium for free to get updates from this writer.
Hem StringBuffer hem de StringBuilder mutable (değişebilir) karakter dizileridir. Yani, bir kez oluşturulduktan sonra içerikleri değiştirilebilir, bu da yeni nesne oluşturma maliyetini ortadan kaldırır. Temel farkları şunlardır:
StringBuffer
Thread-safe(İş parçacığı güvenli): Metodlarısynchronized'dır, yani aynı anda birden fazla iş parçacığı tarafından güvenle erişilebilir. Bu, performans maliyeti getirir ancak çoklu iş parçacıklı ortamlarda veri tutarlılığını sağlar.- Genellikle çoklu iş parçacıklı (multi-threaded) ortamlarda yoğun String manipülasyonu gerektiğinde tercih edilir.
StringBuffer sb = new StringBuffer("Java");
sb.append(" Programlama"); // "Java Programlama"
sb.insert(4, " için"); // "Java için Programlama"
sb.reverse(); // ".amalmargorP niçi avaJ"
System.out.println(sb);StringBuilder
Not thread-safe(İş parçacığı güvenli değil): Metodlarısynchronizeddeğildir, bu daStringBuffer'dan daha hızlıdır. Ancak, aynı anda birden fazla iş parçacığı tarafından erişildiğinde tutarsız sonuçlar verebilir.- Genellikle tek iş parçacıklı (single-threaded) ortamlarda veya iş parçacığı güvenliğinin manuel olarak yönetildiği durumlarda yoğun String manipülasyonu gerektiğinde tercih edilir.
StringBuilder sbld = new StringBuilder("Java");
sbld.append(" Geliştirici"); // "Java Geliştirici"
sbld.delete(4, 15); // "Java" (Geliştirici kısmı silindi)
System.out.println(sbld);Ne Zaman Hangisini Kullanmalı?
String: Metin içeriğinin değişmeyeceğini bildiğinizde veya çok az değişiklik olduğunda kullanın. Örneğin, sabit mesajlar, anahtarlar.StringBuilder: Tek iş parçacıklı bir ortamda yoğun metin manipülasyonu yaparken, en iyi performansı almak için tercih edin.StringBuffer: Çoklu iş parçacıklı bir ortamda, birden fazla iş parçacığının aynı metin üzerinde değişiklik yapacağı durumlarda, güvenlik ve veri tutarlılığı için kullanın.
Sonuç
Java’da String'ler, metin yönetimi için vazgeçilmez bir araçtır. Immutable yapıları güvenli olsa da, performans kaygıları StringBuffer ve StringBuilder gibi mutable alternatifleri gerekli kılar. Hangi sınıfı kullanacağınız, uygulamanızın performans beklentileri ve iş parçacığı güvenliği (thread-safety) gereksinimlerine bağlıdır. Bu makalede ele alınan metodlar ve kavramlar, Java'da metin verileriyle daha etkin ve verimli bir şekilde çalışmanız için sağlam bir temel oluşturacaktır.






