Bölüm 5: Dizgi
Çoktan Seçmeli · Dizgi Kavramı
Soru 1: Birleştirme Sırası
System.out.println(1 + 2 + "3" + 4 * 5); ne yazdırır?
B: Önce çarpma yapılır: 4 * 5 = 20. Sonra + soldan sağa işlenir: 1 + 2 = 3 (iki sayı), 3 + "3" = "33" (bir yan dizgi, birleştirme), "33" + 20 = "3320". A ilk iki sayıyı da birleştirir; C çarpmayı unutur.
Çıktı Sorusu · Dizgi Kavramı
Soru 2: char ile Aritmetik
Program ne yazdırır? ('A' = 65, 'B' = 66)
char c = 'A'; System.out.println(c + 2); System.out.println((char) (c + 2)); System.out.println("" + c + 2); System.out.println(c + 'B' + "C"); System.out.println("" + 1 + 2 + '3');
Cevabı göster
67 C A2 131C 123
char + intsayısal toplamadır: 65 + 2 = 67.- Sonucu
(char)ile çevirmek kod 67'nin karakterini verir: C. - Başta
""olunca her+birleştirmedir: "A" + 2 = "A2". c + 'B'ikichartoplamıdır (65 + 66 = 131); ardından "C" eklenir.- "" + 1 = "1", + 2 = "12", + '3' = "123".
Çıktı Sorusu · Dizgi Kavramı
Soru 3: Geriye Doğru İndisleme
Program ne yazdırır?
String s = "Giresun"; String t = ""; for (int i = s.length() - 1; i >= 0; i -= 2) { t += s.charAt(i); } System.out.println(t + " " + t.length()); System.out.println(s.substring(2, 5) + s.indexOf("sun") + s.indexOf('x'));
Cevabı göster
nsrG 4 res4-1
İndisler: G0 i1 r2 e3 s4 u5 n6. Döngü 6, 4, 2, 0 indislerini okur: n, s, r, G.
substring(2, 5) 2 dahil 5 hariç: "res". "sun" indis 4'te başlar; 'x' yoktur, −1. Soldaki "res" dizgi olduğu için 4 ve −1 sayı olarak eklenmez, metne yapışır: "res4-1".
Hata Bulma · Dizgi Kavramı
Soru 4: Tersten Yazdırmada Sınır
Kod, dizginin bütün karakterlerini sondan başa, aralarına tire koyarak yazdırmak için yazıldı. Program ne yazdırır? Hata nerede?
String kelime = "Ada Kaya"; for (int i = kelime.length() - 1; i > 0; i--) { System.out.print("-" + kelime.charAt(i)); }
Cevabı göster
-a-y-a-K- -a-d
Uzunluk 8: indisler A0 d1 a2 (boşluk)3 K4 a5 y6 a7. Döngü 7'den 1'e iner; i > 0 koşulu yüzünden indis 0'daki "A" yazılmaz. Boşluk da bir karakterdir: "- " olarak görünür.
Düzeltme: koşul i >= 0 olmalı. Çıktı -a-y-a-K- -a-d-A olur.
Adım Adım Çalıştırma · Dizgi Metotları
Soru 5: E-posta Adresini Ayırmak
Her satırdan sonra indisler ve parçalar nedir? Program ne yazdırır?
23 karakter; indisler 0 … 22. Kodda dizgi hiç değişmeyecek: her metot yeni değer döndürür.
indexOf('@') ilk @'nin indisi: 8 ("ali.veli" 8 karakter).
Arama indis 8'den başlar: 3'teki nokta atlanır, ilk nokta 16'da bulunur.
substring(0, 8): 0 … 7, bitiş hariç.
substring(9, 16): @'den sonrası, noktaya kadar: 7 karakter.
lastIndexOf('.') = 20; substring(21) sona kadar: "tr".
replace('.', ' ') yeni bir dizgi döndürür; kullanici yine "ali.veli"dir.
String e = "ali.veli@giresun.edu.tr"; int at = e.indexOf('@'); int nokta = e.indexOf('.', at); String kullanici = e.substring(0, at); String alan = e.substring(at + 1, nokta); String uzanti = e.substring(e.lastIndexOf('.') + 1); System.out.println(kullanici.replace('.', ' ') + " " + alan + " " + uzanti);
Çoktan Seçmeli · Dizgi Metotları
Soru 6: substring ve indexOf
Program ne yazdırır?
String s = "Java Programlama";
System.out.println("[" + s.substring(5, 9) + "] "
+ s.indexOf("a", 2) + " "
+ s.lastIndexOf("am"));D: Program 5'te başlar; substring(5, 9) 5, 6, 7, 8 indislerini alır: "Prog" (bitiş hariç, uzunluk 9 − 5 = 4). indexOf("a", 2) aramaya indis 2'den başlar: 1'deki a atlanır, 3 bulunur. "am" 10 ve 13'te geçer; lastIndexOf sonuncusunu verir.
Çıktı Sorusu · Dizgi Metotları
Soru 7: split, trim ve parseInt
Program ne yazdırır?
String s = " 3,elma, 12 ,armut ";
String[] p = s.trim().split(",");
System.out.println(p.length + " [" + p[2] + "]");
int toplam = Integer.parseInt(p[0])
+ Integer.parseInt(p[2].trim());
System.out.println(toplam + " "
+ String.join("-", p[1], p[3]));
System.out.println("Giresun".replace("e", "E")
.toLowerCase().indexOf('e'));Cevabı göster
4 [ 12 ] 15 elma-armut 3
trim() yalnızca baştaki ve sondaki boşlukları atar; split(",") parçaların içindeki boşluklara dokunmaz: p = ["3", "elma", " 12 ", "armut"].
parseInt(" 12 ") NumberFormatException fırlatırdı; önce trim() gerekir: 3 + 12 = 15. Son satırda "GirEsun" küçük harfe çevrilince yine "giresun" olur; ilk e indis 3'te.
Çoktan Seçmeli · Değiştirilemezlik
Soru 8: Sonucu Atamamak
Program ne yazdırır?
String s = "java";
s.toUpperCase();
s.concat("!");
String t = s.replace('a', 'o');
System.out.println(s + " " + t);A: String değiştirilemez: toUpperCase() ve concat("!") yeni dizgiler döndürür, ama sonuçlar atanmadığı için kaybolur; s hâlâ "java"dır. replace sonucu t'ye atanmıştır: "jovo". Değişiklik için s = s.toUpperCase(); yazılır.
Adım Adım Çalıştırma · Değiştirilemezlik
Soru 9: StringBuilder İzleme
Her satırdan sonra tamponun içeriği nedir? Program ne yazdırır?
Değiştirilebilir bir karakter tamponu oluşur.
append aynı nesneyi döndürür; bu yüzden zincirlenebilir. 42 sayısı "42" olarak eklenir.
insert(0, "Java ") başa ekler; eski karakterler 5 sağa kayar.
İndis 5'teki 'd' yerinde 'D' olur. String'de charAt(5) = 'D' yazılamazdı.
length() − 2 = 10: indis 10'daki '2' silinir; '!' sola kayar.
reverse tamponu yerinde ters çevirir.
toString() içerikten yeni bir String üretir.
StringBuilder sb = new StringBuilder("ders");
sb.append(42).append('!');
sb.insert(0, "Java ");
sb.setCharAt(5, 'D');
sb.deleteCharAt(sb.length() - 2);
sb.reverse();
String s = sb.toString();
System.out.println(s + " " + s.length());Çoktan Seçmeli · Değiştirilemezlik
Soru 10: Döngüde Birleştirme
n parçayı bir döngüde s += parca; ile birleştirmek neden yavaştır?
C: String değiştirilemediği için her += eski içeriği ve yeni parçayı yeni bir nesneye kopyalar; kopyalanan karakterler 1 + 2 + … + n büyür. StringBuilder.append aynı tamponu büyütür; toplam iş ortalamada O(n). Havuz yalnızca dizgi sabitlerini tutar (A); String'in böyle bir uzunluk sınırı yoktur (B).
Çıktı Sorusu · Kullanıcı Girişi
Soru 11: nextInt, next ve nextLine
Klavyeden 25⏎Ali Veli Can⏎ girilir. Program ne yazdırır?
Scanner k = new Scanner(System.in); int yas = k.nextInt(); String a = k.nextLine(); String b = k.next(); String c = k.nextLine(); System.out.println("[" + a + "][" + b + "][" + c + "] " + yas);
Cevabı göster
[][Ali][ Veli Can] 25
nextInt() yalnızca 25'i okur, ardındaki ⏎ tamponda kalır. İlk nextLine() o ⏎'ye kadar olan boş metni okur: a = "".
next() bir kelime okur: "Ali". Son nextLine() satırın kalanını alır; "Ali"den sonraki boşluk da satırın parçasıdır: " Veli Can".
Çoktan Seçmeli · Kullanıcı Girişi
Soru 12: next ve nextLine
Girdi satırı ␣␣␣merhaba dünya⏎ (başta üç boşluk). String a = k.next(); String b = k.nextLine(); sonrası a ve b nedir?
D: next() baştaki boşlukları atlar ve bir sonraki boşluğa kadar okur: "merhaba". nextLine() kaldığı yerden satır sonuna kadar her şeyi alır; "merhaba"dan sonraki boşluk da dahildir. ⏎ tüketilir ama sonuca katılmaz.
Adım Adım Çalıştırma · Karşılaştırma
Soru 13: Dizgi Havuzu
Her satırdan sonra hangi değişken hangi nesneyi gösterir? Program ne yazdırır?
Dizgi sabitleri sınıf yüklenirken havuza girer; a havuzdaki "ders"i gösterir.
"de" + "rs" iki sabittir; derleyici onu "ders" olarak hesaplar: b aynı havuz nesnesini gösterir.
new her zaman havuz dışında yeni bir nesne üretir.
d = c referansı kopyalar: ikisi aynı nesne.
e havuzdaki "de"yi gösterir.
e bir değişkendir: e + "rs" çalışma zamanında hesaplanır ve yeni bir nesne üretir.
== referansları karşılaştırır: a ile b aynı havuz nesnesi, c ile d aynı heap nesnesi.
f farklı nesnedir ama içeriği aynıdır. f.intern() havuzdaki eşini, yani a'nın nesnesini döndürür.
String a = "ders";
String b = "de" + "rs";
String c = new String("ders");
String d = c;
String e = "de";
String f = e + "rs";
System.out.println((a == b) + " " + (a == c) + " " + (c == d));
System.out.println((a == f) + " " + a.equals(f) + " " + (a == f.intern()));Çoktan Seçmeli · Karşılaştırma
Soru 14: compareTo
"kalem".compareTo("kale") ve "Kale".compareTo("kale") sırasıyla ne döndürür? ('K' = 75, 'k' = 107)
A: "kale", "kalem"in önekidir: farklı karakter yoktur, uzunluk farkı döner: 5 − 4 = 1 (pozitif: "kalem" sonra gelir). İkincide ilk farklı karakterler 'K' ve 'k': 75 − 107 = −32. Büyük harfler küçüklerden önce sıralanır.
Çoktan Seçmeli · Karşılaştırma
Soru 15: null ile Karşılaştırma
String cevap = null; iken aşağıdaki satırlardan hangisi istisna fırlatır?
C: null bir referans üzerinden metot çağrılamaz: NullPointerException. A ve B'de metot sabit üzerinde çağrılır; null argümanla false döner. D'de birleştirme null'ı "null" metnine çevirir: null!. Bu yüzden sabit öne yazılır: "evet".equals(cevap).
Çıktı Sorusu · Biçimli Çıktı
Soru 16: printf Genişlik ve Hassasiyet
Türkçe yerel ayarlı (tr-TR) bilgisayarda çıktıyı karakter karakter yazın.
System.out.printf("[%5s][%-6s][%04d][%6.2f][%.0f]%n",
"abc", "de", 37, 3.14159, 2.5);Cevabı göster
[ abc][de ][0037][ 3,14][3]
%5s: 5 karakter, sağa hizalı → ··abc.%-6s: sola hizalı, sağa 4 boşluk → de····.%04d: başa sıfır doldurur → 0037.%6.2f: 2 ondalık, toplam 6 karakter; ayırıcı tr-TR'de virgül → ··3,14.%.0f: ondalıksız; Java yarımı yukarı yuvarlar (HALF_UP): 2.5 → 3.
Locale.US verilseydi 3.14 yazılırdı.
Çoktan Seçmeli · Biçimli Çıktı
Soru 17: Yanlış Yer Tutucu
System.out.printf("%d%n", 3.5); çalıştırılınca ne olur?
B: Biçim dizgisi derleyici için sıradan bir metindir; uyuşmazlık ancak çalışırken fark edilir. %d tam sayı tipleri ister, double için %f gerekir; printf dönüşüm yapmaz, istisna fırlatır.
Çoktan Seçmeli · Uygulamalar
Soru 18: Ortadaki Karakter
Metot, kelimenin ortadaki karakterini (çift uzunlukta ortadaki ikisinden soldakini) döndürür. orta("Java") ve orta("Giresun") ne döndürür, orta("") çağrısında ne olur?
static char orta(String kelime) { int uzunluk = kelime.length(); int ortaIndex = uzunluk / 2; if (uzunluk % 2 == 0) { return kelime.charAt(ortaIndex - 1); } else { return kelime.charAt(ortaIndex); } }
A: "Java" (J0 a1 v2 a3): uzunluk 4 çift, ortaIndex 2, charAt(1) = 'a'. "Giresun" (G0 i1 r2 e3 s4 u5 n6): uzunluk 7 tek, charAt(3) = 'e'. Boş dizgide uzunluk 0 çift sayılır ve charAt(-1) çağrılır: çalışma zamanı istisnası. Derleyici değerleri bilmez (D); Java'da "boş karakter" yoktur (B). Önlem: başta if (kelime.isEmpty()) denetimi.
Kod Yazma · Uygulamalar
Soru 19: Boşluk Sayma
int boslukSay(String metin) metodunu charAt ile yazın: metindeki boşluk karakterlerinin sayısını döndürsün.
boslukSay("Java ile nesne")(iki ardışık boşluk) kaçtır?boslukSay(" a b ")veboslukSay("")kaçtır?metin.split(" ").length - 1neden her zaman doğru sonucu vermez?
Cevabı göster
static int boslukSay(String metin) { int sayac = 0; for (int i = 0; i < metin.length(); i++) { if (metin.charAt(i) == ' ') { sayac++; } } return sayac; }
Sonuçlar: 3, 3 ve 0. charAt bir char döndürür; tek tırnaklı ' ' ile == kullanılır.
split(" ") sondaki boş parçaları atar: " a b ".split(" ") → ["", "a", "b"], sonuç 3 − 1 = 2 olur (yanlış). İlk örnekte 3 doğru çıkar: yöntem tesadüfen tutar.
Kod Yazma · Uygulamalar
Soru 20: Palindrom Denetimi
boolean palindromMu(String s) metodunu yazın: büyük/küçük harf farkını ve harf olmayan karakterleri (boşluk, noktalama) yok saysın, yeni dizgi oluşturmadan iki indisle çalışsın.
"Ey Edip, Adana'da pide ye"→ true"Kayak"→ true"Java"→ false
Cevabı göster
static boolean palindromMu(String s) { int i = 0, j = s.length() - 1; while (i < j) { char a = s.charAt(i), b = s.charAt(j); if (!Character.isLetter(a)) { i++; } else if (!Character.isLetter(b)) { j--; } else if (Character.toLowerCase(a) != Character.toLowerCase(b)) { return false; } else { i++; j--; } } return true; }
Biri baştan biri sondan gelen iki indis; harf olmayan karakter atlanır. char ilkel tip olduğu için != ile karşılaştırılır. Üç örnek için çıktı: true, true, false. Ek dizgi oluşturulmaz; O(n).