Stringmetotlarıyla metinden parça almak, metinde arama yapmak ve metni dönüştürmek- Karakter dizilerini
equalsile doğru şekilde karşılaştırmak String.formatveStringBuilderile 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().
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() + "!");
}
}Baku, Azerbaijan 16 B BAKU, AZERBAIJAN 6 Azerbaijan Baku true Ganja, Azerbaijan hello!
| Metot | Ne yapar | Örnekte |
|---|---|---|
length() | karakter sayısını döndürür | 16 |
charAt(i) | i indeksindeki karakter | charAt(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 çevirir | BAKU, AZERBAIJAN |
contains(s) | s dizinin içinde var mı | contains("ku") → true |
replace(a, b) | tüm a'ları b ile değiştirir | Ganja, Azerbaijan |
trim() | baştaki ve sondaki boşlukları siler | hello |
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.
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);
}
}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.
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));
}
}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.
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");
}
}Elvin scored 47 points (94.0%) Price: 12.50 AZN a12 3a
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.
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));
}
}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. Stringdeğişmezdir:toUpperCase()vereplace()gibi metotlar yeni bir dizi döndürür.- Dizilerin içeriğini
==ile değil,equals()ile karşılaştır. String.format()veprintf()bir şablondan metin oluşturur:%s,%d,%.2f,%n.StringBuilderdeğiştirilebilir bir dizidir:append,insert,reverse,toString.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
"Java".charAt(1) ne döndürür?