String — Hiç Değişmeyen Metin
Önce şunu oku: Stack, Heap ve Pass-by-Value
30 saniyede özet
Bir String oluşturulduktan sonra hiç değişmez; her 'değişiklik' yeni bir String üretir. Metinleri equals ile karşılaştırırsın, döngüde metin biriktirirken de StringBuilder kullanırsın.
Bir arkadaşına not yazdın, sonra bir kelimeyi düzeltmek istedin. Kâğıt mürekkeple yazıldığı için silemiyorsun; yeni bir kâğıda baştan yazıyorsun.
Java’da metinler de böyle çalışır ve bu küçük bilgi birçok şaşkınlığı tek seferde çözer.
Adım adım oku
- s değişkeni, içinde merhaba yazan bir kutuyu gösteriyor.
- toUpperCase() çağrılınca yeni bir kutu açılır: MERHABA. Eski kutu olduğu gibi durur.
- s'nin oku ancak sonucu s'ye atayınca yeni kutuya taşınır.
- Eski kutunun içi hiç değişmedi; sadece artık onu gösteren yok.
-
Bayt:
isim.toUpperCase()yazdım ama isim hâlâ küçük harf! -
Sen: Metot bozuk mu?
-
Bayt: Hayır, çalıştı. Yeni bir metin üretti ve sen onu bir yere koymadın.
-
Bayt: String'in tek kuralı bu: hiç değişmez. Gel, neden işe yaradığına bakalım.
String hiç değişmez
Bir String bir kez oluşturulduktan sonra içi hiç değişmez. Böyle nesnelere immutableOluşturulduktan sonra içi değişmeyen nesne. Anahtar olarak güvenlidir, çünkü hashCode'u hiç değişmez.Sözlükte gör → denir.
toUpperCase, trim, replace gibi metotlar eski metni değiştirmez. Yeni bir String döndürür.
String isim = "ayşe";isim.toUpperCase(); // yeni metin üretildi ve kaybolduSystem.out.println(isim); // ayşe
isim = isim.toUpperCase(); // ok yeni metne taşındıSystem.out.println(isim); // AYŞEBu kural bir kısıtlama gibi görünür ama çok işe yarar. Değişmeyen bir metni herkes güvenle paylaşabilir: HashMap anahtarı olabilir, birden çok thread aynı anda okuyabilir.
Kafam karıştı, daha basit anlat
String’i mürekkeple yazılmış bir not gibi düşün. Düzeltmek istediğinde yeni bir not yazılır. Yeni notu tutmak istiyorsan onu bir değişkene koymalısın.
Program ne yazdırır?
== mi, equals mı?
Kullanıcı klavyeden elma yazdı ve bu metin girdi değişkenine geldi. `girdi == "elma"` ne döner? Cevabı göster
Büyük ihtimalle false. Klavyeden gelen metin program çalışırken yeni bir nesne olarak üretilir. == harflere değil, iki değişkenin aynı nesneyi gösterip göstermediğine bakar.
== iki değişkenin aynı kutuyu gösterip göstermediğini sorar. equals ise kutuların içindeki harflerin aynı olup olmadığını sorar.
Java, koda doğrudan yazdığın metinleri string poolKoda doğrudan yazılan metinlerin tek kopya olarak tutulduğu ortak raf. Aynı sabit metni kullanan her yer aynı nesneyi paylaşır.Program çalışırken üretilen metinler (klavyeden, ağdan, birleştirmeden) bu rafa kendiliğinden girmez. Bu yüzden == bazen tesadüfen true verir; metinler her zaman equals ile karşılaştırılır.Sözlükte gör → denen ortak bir rafta tutar. Bu yüzden iki aynı sabit metin bazen aynı kutu olur ve == şans eseri doğru çıkar.
String a = "elma";String b = new String("elma");
a == b; // false: iki ayrı kutua.equals(b); // true: harfler aynıKafam karıştı, daha basit anlat
İki kişinin aynı kitabı okuması ile aynı nüsha üzerinden okuması farklı şeylerdir. equals kitabın aynı olup olmadığını, == ise elindeki nüshanın aynı olup olmadığını sorar.
İki metnin aynı harflerden oluşup oluşmadığını nasıl kontrol edersin?
Program ne yazdırır?
Satır satır: döngüde metin biriktirmek
Metin değişmediğine göre, bir döngüde her += ne yapar? Kısa bir iz sürelim.
Her += yeni bir metin demek
String rapor = "";for (String satir : satirlar) { rapor += satir + "\n";}System.out.println(rapor);Debug
başlangıç Boş bir metinle başlıyoruz.
- rapor
- = ""
- üretilen metin
- = 1
Sol/sağ ok tuşlarıyla da gezebilirsin.
Döngüde metin biriktirmek
Tohum 57855Oynat ya da adımla: her adım döngünün beşte birini işler.
Şu an ne oldu?
1.000 satırlık rapor
Aynı rapor iki yolla biriktiriliyor; kaç karakter yazıldığını sayıyoruz.
Görevler0/2
+= ile StringBuilder’dan 100 kat fazla karakter yazdıraçık
İpucu
Uzun bir rapor.
Farkın 5 katın altında kaldığı bir rapor bulaçık
İpucu
Kısa listelerde fark küçüktür.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. 1.000 satırda
+=yaklaşık 20 milyon karakter yazdı, StringBuilder 85 bin. - “100 satır” seç. Fark yaklaşık 22 kat.
- “10 satır” seç. Fark iki kat kadar: kısa listede okunabilirlik öncelikli olabilir.
Bir döngüde binlerce satırı `rapor += satir` ile birleştirmek neden yavaşlar?
StringBuilder ne zaman gerekir?
StringBuilder değişebilen bir metin defteridir. append ile sona ekler, en sonda toString() ile tek bir String üretirsin.
StringBuilder rapor = new StringBuilder();for (String satir : satirlar) { rapor.append(satir).append('\n');}String sonuc = rapor.toString();Tek satırlık birleştirmelerde ("Merhaba " + isim) buna gerek yok. Derleyici o satırı zaten verimli hâle getirir; sorun yalnızca döngüde birikmedir.
Kafam karıştı, daha basit anlat
Tek bir cümle kuruyorsan + yeter. Yüzlerce satırlık bir liste topluyorsan defteri aç: StringBuilder.
Hangi durumda StringBuilder kullanmak gerçekten fark yaratır?
Bankada da hesap ekstresi tam böyle kurulur: satırlar döngüde bir deftere eklenir, en sonda tek bir metin olarak basılır.
Derinleş · Hesap ekstresi: satırları biriktirmek 3 dosya · ~31 satır · ilk okumada atlayabilirsin
Tuzaklar
Sonucu atamamak. isim.trim(); tek başına hiçbir şey yapmaz. Sonucu bir değişkene koy.
Metinleri == ile karşılaştırmak. Testte çalışıp gerçek girdide bozulabilir. Metin karşılaştırmasında hep equals kullan.
Noktayla bölmek. split bir kalıp (regex) bekler ve orada nokta “herhangi bir karakter” demektir. "a.b".split(".") boş bir dizi döner; doğrusu split("\\.").
Bu kod kullanıcı 'evet' yazsa bile çoğu zaman "İptal edildi" diyor. Hatalı satır hangisi?
Kendini sına
`isim.toUpperCase()` çağrısı isim değişkenini büyük harfe çevirir.
Program ne yazdırır?
Aklında kalacak üç şey
- 1 String değişmez. toUpperCase gibi metotlar yeni bir String döndürür, sonucu bir değişkene atamazsan kaybolur.
- 2 İki metnin aynı olup olmadığını equals söyler. == yalnızca aynı nesne olup olmadıklarına bakar.
- 3 Döngü içinde metin biriktirirken StringBuilder kullanılır; tek satırlık birleştirmelerde düz + yeterlidir.
3 kart sonraki derste seni bekliyor
Bu dersin üstüne kurulanlar
Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.