Dizgiler
Giriş
Öğrenme Çıktıları
String ve char ayrımını açıklamak.
İndeks ve temel metotları kullanmak.
İçerik ve başvuru karşılaştırmasını ayırmak.
printf ile biçimli metin üretmek.
Temeller
String Nedir?
String, karakter dizisini temsil edenjava.langsınıfıdır (import gerekmez).- Dizgi sabitleri çift tırnakla (
"Tarkan"),chartek tırnakla ('T') yazılır. Stringilkel tür değil, değiştirilemez bir nesnedir; değişken nesnenin başvurusunu tutar.
Temeller
String Oluşturma
String ad = "Tarkan"; String boş = ""; String kopya = new String(ad); String yok = null;
- Çoğunlukla
newkullanmadan dizgi sabiti tercih edilir. ""uzunluğu 0 olan gerçek bir nesnedir;nullise hiçbir nesneyi göstermez (yok.length()→NullPointerException).
Temeller
Değişmezlik
- String oluşturulduktan sonra içeriği değişmez.
- Birleştirme ve dönüştürme işlemleri yeni String üretir; eski nesne olduğu gibi kalır.
- Sonucu kullanmak için dönen değer bir değişkene atanmalıdır.
- Hiçbir değişkenin göstermediği nesneyi çöp toplayıcı (garbage collector) temizler.
String s = "Merhaba";
s = s + "!"; → yeni nesne; ok ona taşındı, eski nesne aynı.
Temeller · Kodu adım adım çalıştır
Değişmezlik: toUpperCase()
dil, havuzdaki "java" nesnesini gösterir.
toUpperCase() yeni bir "JAVA" nesnesi üretir; ama sonuç hiçbir değişkene atanmadı → kaybolur. dil hâlâ eski nesnede.
Eski nesne değişmediği için java yazar.
Bu kez dönen yeni nesne dil'e atanır: ok yeni nesneye taşınır. "java" nesnesi yine aynen durur.
JAVA yazar. Değişen nesne değil, değişkenin gösterdiği yerdir.
String dil = "java"; dil.toUpperCase(); System.out.println(dil); // java dil = dil.toUpperCase(); System.out.println(dil); // JAVA
İndeks
İndeksleme
- İlk karakter 0, son karakter length() − 1 indeksindedir;
length()bir metottur (dizilerdekilengthalanından farklı). charAt(i)o konumdakichardeğerini döndürür;charAt(7)→StringIndexOutOfBoundsException.
Metotlar · Kodu adım adım çalıştır
Temel Metotlar
16 karakterlik dizgi (boşluk da bir karakterdir: indeks 4).
length() → 16; indeksler 0 … 15.
indexOf aranan metnin ilk karakterinin indeksini verir → 5 (yoksa −1).
substring(5, 16): 5 dahil, 16 hariç → 11 karakter: "Programlama".
contains("Java") → true. Hiçbir metot s'yi değiştirmedi.
Sonuçlar birleştirilip yazdırılır.
String s = "Java Programlama"; int uzunluk = s.length(); int konum = s.indexOf("Programlama"); String alt = s.substring(5, 16); boolean içerir = s.contains("Java"); System.out.println(alt + " " + konum);
Metotlar
Sık String Metotları
| Metot | Sonuç |
|---|---|
| length() | Karakter/kod birimi sayısı |
| charAt(i) | i konumundaki char |
| substring(a,b) | a dahil, b hariç alt dizgi |
| indexOf(x) | İlk konum veya -1 |
| toLowerCase() | Küçük harfli yeni String |
| trim() / strip() | Kenar boşlukları kaldırılmış yeni String |
Metotlar
Alt Dizgi Sınırları: s = "PROGRAM"
İndeksleri karakterlerin arasındaki çizgiler gibi düşünün: 0 ile 3 arası "PRO". Uzunluk = 3 − 0.
Bitiş length() = 7 olabilir: son karakter dahil edilir.
Tek parametreli sürüm: başlangıçtan sona kadar.
Başlangıç = bitiş → boş dizgi "" (hata değil).
Bitiş > length() ya da başlangıç > bitiş → çalışma zamanı hatası.
substring(a, b): a dahil, b hariç; sonuç uzunluğu b − a.- Geçerli aralık: 0 ≤ a ≤ b ≤ length().
Metotlar · Kodu adım adım çalıştır
Uygulama: E-postayı Parçalama
11 karakterlik e-posta adresi; kullanıcı adını ve alan adını ayıracağız.
indexOf('@') → 3: ayırıcının konumu.
substring(0, 3): 0 dahil, 3 (@) hariç → "ali".
substring(4): @'den sonraki karakterden sona kadar → "gru.edu".
charAt(0) bir char döndürür: 'a' (tek tırnak).
Parçalar birleştirilerek yazdırılır.
Character.toUpperCase char'ı büyük harfe çevirir → A. eposta hiç değişmedi.
String eposta = "ali@gru.edu"; int at = eposta.indexOf('@'); String kullanıcı = eposta.substring(0, at); String alan = eposta.substring(at + 1); char ilk = eposta.charAt(0); System.out.println(kullanıcı + " / " + alan); System.out.println(Character.toUpperCase(ilk));
Karşılaştırma · Kodu adım adım çalıştır
== ile equals Farkı
Sabit "Giresun" String havuzuna konur; a onu gösterir.
new String(...) içerik aynı olsa da heap'te ayrı bir nesne açar.
Aynı sabit tekrar yazıldı: havuzdaki mevcut nesne paylaşılır → c ile a aynı oku taşır.
a == b: iki ok farklı nesneye gidiyor → false (içeriğe bakılmaz).
a == c: iki ok aynı nesnede → true.
equals karakterleri tek tek karşılaştırır: G=G, i=i, … → true. İçerik için daima equals.
String a = "Giresun"; String b = new String("Giresun"); String c = "Giresun"; System.out.println(a == b); // false System.out.println(a == c); // true System.out.println(a.equals(b)); // true
Karşılaştırma
Karşılaştırma Metotları
| Metot | Amaç | Örnek |
|---|---|---|
equals | İçerik eşitliği | "abc".equals("abc") → true |
equalsIgnoreCase | Büyük-küçük harfi yok sayan eşitlik | "Java".equalsIgnoreCase("JAVA") → true |
startsWith | Belirli metinle başlama | "Giresun".startsWith("Gir") → true |
endsWith | Belirli metinle bitme | "Giresun".endsWith("sun") → true |
compareTo | Sözlüksel sıra: <0, 0, >0 | "elma".compareTo("armut") → pozitif |
compareTo Unicode değerlerine göre çalışır: büyük harfler küçüklerden önce gelir ve Türkçe harfler (ç, ğ, ı, ö, ş, ü) alfabe sırasına uymayabilir.
Bellek
String Havuzu
- Aynı dizgi sabitleri havuzdaki tek bir nesneyi paylaşır (bellek tasarrufu; değişmezlik sayesinde güvenli).
new String(...)her zaman ayrı nesne oluşturur.- Bir String'in havuzdan mı geldiği koda bakınca her zaman anlaşılmaz; bu yüzden içerik karşılaştırmasında
==değilequalskullanılır.
Girdi
Scanner ile Metin Girdisi
import java.util.Scanner; // ... Scanner klavye = new Scanner(System.in); String kelime = klavye.next(); klavye.nextLine(); String satır = klavye.nextLine();
next()bir kelime okur: baştaki boşlukları atlar, ilk boşlukta/satır sonunda durur.nextLine()satır sonuna (⏎) kadar her şeyi okur ve ⏎'ı tüketir.next()veyanextInt()sonrası tamponda kalan ⏎, birnextLine()ile ayrıca tüketilmelidir.
Girdi · Kodu adım adım çalıştır
Kod İzleme: next() ve nextLine()
Scanner klavye akışına bağlanır; tampon şimdilik boş.
next() okuyacak bir şey bulamaz ve bekler. Kullanıcı Ada yazıp Enter'a basar → tampona "Ada⏎" girer.
next() boşluk/satır sonuna kadar okur → "Ada". ⏎ tamponda kalır.
nextLine() ⏎'a kadar okur → "" (boş) döner ve ⏎'ı tüketir. Artık tampon temiz.
Tampon boş → nextLine() bekler. Kullanıcı Giresun Merkez yazıp Enter'a basar.
Satırın tamamı (boşluk dahil) okunur → "Giresun Merkez"; ⏎ tüketilir ama sonuca eklenmez.
İki değer yazdırılır.
Scanner klavye = new Scanner(System.in);
String kelime = klavye.next();
klavye.nextLine();
String satır = klavye.nextLine();
System.out.println(kelime + " | " + satır);3. satır olmasaydı 4. satırdaki nextLine() kalan ⏎'ı okuyup hemen boş satır döndürürdü.
Performans
Birleştirme ve StringBuilder
+az sayıda birleştirme için okunaklıdır.- Döngüde
s = s + xher turda yeni String oluşturur ve eskiyi kopyalar. StringBuilderdeğiştirilebilir bir tampondur:appendaynı nesneye ekler.toString()tamponun o anki içeriğinden son String'i üretir.
Performans · Kodu adım adım çalıştır
Kod İzleme: StringBuilder ile Birleştirme
Boş, değiştirilebilir bir tampon oluşturulur.
1 <= 3 → true
append(1) ve append(' ') aynı nesneye ekler (yeni String yok) → "1 ".
i++ → 2 <= 3 → true
append(2) ve append(' ') aynı nesneye ekler (yeni String yok) → "1 2 ".
i++ → 3 <= 3 → true
append(3) ve append(' ') aynı nesneye ekler (yeni String yok) → "1 2 3 ".
i++ → 4 <= 3 → false: döngü biter.
toString() tampondan tek bir String üretir.
Sondaki boşluk görünsün diye | eklendi.
StringBuilder metin = new StringBuilder(); for (int i = 1; i <= 3; i++) { metin.append(i).append(' '); } String sonuç = metin.toString(); System.out.println(sonuç + "|");
Biçimleme
printf ile Biçimleme
System.out.printf("%-8s %3d %7.2f%n", ad, adet, fiyat);%-8s ← ad: "Java" 8 hücreye sola yaslanır, kalan 4 hücre boşluk.
%3d ← adet: 3 tam sayısı 3 hücreye sağa yaslanır.
%7.2f ← fiyat: 2 ondalıkla "17.50" (5 karakter) 7 hücreye sağa yaslanır.
%n satır sonu ekler. Belirteçler argümanlarla sırayla eşleşir; tür uyuşmazsa hata oluşur.
%s metin, %d tam sayı, %f ondalıklı sayı. Türkçe yerel ayarlı bilgisayarda %.2f ondalık ayırıcı olarak virgül basabilir (17,50).
Temeller
Unicode ve Metin
- String UTF-16 kod birimlerinden oluşur.
- Bazı görünür karakterler iki char veya birden fazla Unicode kod noktası içerebilir.
- Kullanıcıya görünen karakter sayısı için yalnızca length her durumda yeterli olmayabilir.
Özet
Bölüm Özeti
- String değiştirilemez bir nesnedir; işlemler yeni String döndürür.
- İndeksler 0'dan length()-1'e uzanır.
- İçerik karşılaştırması equals ile, sözlüksel sıra compareTo ile yapılır.
- Yoğun birleştirmede StringBuilder; biçimli çıktıda printf kullanılabilir.
Özet
Kontrol Soruları
- String neden değiştirilemez olarak adlandırılır?
- substring başlangıç ve bitiş sınırlarını nasıl kullanır?
- == ile equals arasındaki fark nedir?
- next ve nextLine nasıl ayrılır?
- Döngü içinde neden StringBuilder tercih edilebilir?
Son
← → veya boşluk ile gezinin · F: tam ekran · Home/End: ilk/son slayt