İçeriğe geç
Educora
Başlangıç15 dk3 / 18

Karakter dizileri ve StringBuilder

Metinlerle çalışmayı öğren: String metotları, karakter dizilerini karşılaştırma, biçimlendirme ve değiştirilebilir StringBuilder.

Kendini test et
Bu derste öğreneceklerin
  • String metotlarıyla metinden parça almak, metinde arama yapmak ve metni dönüştürmek
  • Karakter dizilerini equals ile doğru şekilde karşılaştırmak
  • String.format ve StringBuilder ile metin oluşturmak

Kullanıcı adları, SMS'ler, ürün açıklamaları, arama sorguları... Programların işlediği verilerin büyük kısmı metindir. Java'da metin, String sınıfının nesneleriyle temsil edilir. Bu derste karakter dizilerini kesmeyi, içlerinde arama yapmayı, karşılaştırmayı ve verimli şekilde oluşturmayı öğreneceksin.

String metotları

Karakter dizisi, karakterlerden oluşan bir sıradır ve her karakterin bir indeksi vardır. İndeksler 0'dan başlar: "Baku" dizisinde B 0. indekste, u ise 3. indekstedir. String sınıfının onlarca hazır metodu vardır; bunlar nokta ile çağrılır: text.length().

Java
public class Main {
    public static void main(String[] args) {
        String city = "Baku";
        String country = "Azerbaijan";
        String text = city + ", " + country;
        System.out.println(text);
        System.out.println(text.length());
        System.out.println(text.charAt(0));
        System.out.println(text.toUpperCase());
        System.out.println(text.indexOf("Azer"));
        System.out.println(text.substring(6));
        System.out.println(text.substring(0, 4));
        System.out.println(text.contains("ku"));
        System.out.println(text.replace("Baku", "Ganja"));
        System.out.println("  hello  ".trim() + "!");
    }
}
Beklenen çıktı
Baku, Azerbaijan
16
B
BAKU, AZERBAIJAN
6
Azerbaijan
Baku
true
Ganja, Azerbaijan
hello!
MetotNe yaparÖrnekte
length()karakter sayısını döndürür16
charAt(i)i indeksindeki karaktercharAt(0) → B
indexOf(s)s'nin ilk başladığı yer (bulunamazsa −1)indexOf("Azer") → 6
substring(a, b)a'dan b'ye kadar olan parça (b hariç)substring(0, 4) → Baku
toUpperCase(), toLowerCase()büyük ya da küçük harfe çevirirBAKU, AZERBAIJAN
contains(s)s dizinin içinde var mıcontains("ku") → true
replace(a, b)tüm a'ları b ile değiştirirGanja, Azerbaijan
trim()baştaki ve sondaki boşlukları silerhello

Karakter dizileri değişmezdir

Bir String nesnesi oluşturulduktan sonra değiştirilemez; yani değişmezdir (immutable). toUpperCase() gibi metotlar eski diziyi değiştirmez, yeni bir dizi döndürür. Sonucu saklamak istiyorsan onu bir değişkene ata.

Java
public class Main {
    public static void main(String[] args) {
        String name = "aysel";
        name.toUpperCase();
        System.out.println(name);
        name = name.toUpperCase();
        System.out.println(name);
    }
}
Beklenen çıktı
aysel
AYSEL

Karakter dizilerini karşılaştırmak

== operatörü iki dizinin metnini karşılaştırmaz; bellekte aynı nesne olup olmadıklarını kontrol eder. İçeriği karşılaştırmak için equals(), büyük-küçük harf farkını yok saymak için equalsIgnoreCase() kullan.

Java
public class Main {
    public static void main(String[] args) {
        String a = "java";
        String b = new String("java");
        String c = "JAVA";
        System.out.println(a == b);
        System.out.println(a.equals(b));
        System.out.println(a.equals(c));
        System.out.println(a.equalsIgnoreCase(c));
    }
}
Beklenen çıktı
false
true
false
true

Biçimlendirme ve birleştirme

Birçok parçayı + ile birleştirdiğinde metnin okunması kısa sürede zorlaşır. String.format() bir şablon alır: %s yerine bir karakter dizisi, %d yerine bir tam sayı, %.1f yerine ayırıcıdan sonra tek basamaklı bir ondalık sayı gelir; %% ise yüzde işareti yazar. System.out.printf() böyle bir şablonu doğrudan ekrana yazar, %n ise yeni satır demektir.

Java
public class Main {
    public static void main(String[] args) {
        String name = "Elvin";
        int score = 47;
        double percent = 94.0;
        String report = String.format("%s scored %d points (%.1f%%)", name, score, percent);
        System.out.println(report);
        System.out.printf("Price: %.2f AZN%n", 12.5);
        System.out.println("a" + 1 + 2);
        System.out.println(1 + 2 + "a");
    }
}
Beklenen çıktı
Elvin scored 47 points (94.0%)
Price: 12.50 AZN
a12
3a
Ondalık ayırıcı bilgisayarın bölge ayarlarına bağlıdır: Azerbaycanca, Rusça ya da Türkçe ayarlarda 94,0 ve 12,50 görürsün.

Son iki satıra dikkat et: + soldan sağa hesaplanır. "a" + 1 zaten bir karakter dizisidir; bu yüzden 2 de ona metin olarak eklenir. 1 + 2 + "a" ifadesinde ise önce sayılar toplanır, sonra sonuç metne eklenir.

StringBuilder: değiştirilebilir dizi

Karakter dizileri değişmez olduğu için her + işlemi yeni bir nesne oluşturur. Metin yüzlerce küçük parçadan oluşturulduğunda (örneğin bir döngünün içinde) bu, belleği ve zamanı boşa harcar. **StringBuilder** ise değiştirilebilir bir dizidir: append() sona ekler, insert() istenen yere yerleştirir, reverse() ters çevirir, toString() de hazır String nesnesini döndürür.

Java
public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        sb.append(", ");
        sb.append("Elvin").append('!');
        System.out.println(sb);
        sb.insert(0, ">> ");
        System.out.println(sb);
        System.out.println(sb.length());
        sb.reverse();
        System.out.println(sb);
        String word = "level";
        String reversed = new StringBuilder(word).reverse().toString();
        System.out.println(word.equals(reversed));
    }
}
Beklenen çıktı
Hello, Elvin!
>> Hello, Elvin!
16
!nivlE ,olleH >>
true

Son satırlar bir palindromu, yani tersten okunduğunda da aynı kalan bir kelimeyi kontrol eder: level kelimesini ters çevirip asıl hâliyle karşılaştırırız. Çağrılar append(...).append(...) şeklinde zincirlenebilir de, çünkü her append aynı StringBuilder nesnesini döndürür.

Önemli noktalar

  • Dizi indeksleri 0'dan başlar; son karakterin indeksi length() - 1'dir.
  • String değişmezdir: toUpperCase() ve replace() gibi metotlar yeni bir dizi döndürür.
  • Dizilerin içeriğini == ile değil, equals() ile karşılaştır.
  • String.format() ve printf() bir şablondan metin oluşturur: %s, %d, %.2f, %n.
  • StringBuilder değiştirilebilir bir dizidir: append, insert, reverse, toString.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
"Java".charAt(1) ne döndürür?