String Nedir
Bir String bir karakter dizisi tutar - bir isim, bir cümle ya da bir dosyadan okunan bir satır gibi metinler. Önceki sayfada String'i referans türleri arasında listelenmiş görmüştünüz; burada ise gerçekten bir tanesiyle çalışacaksınız. Bir string değişmezini (literal) çift tırnakla yazarsınız (tek tırnak tek bir char için ayrılmıştır):
name.length() karakter sayısını döndürür - "Ada" için 3. Bu bir metot çağrısıdır, bu yüzden parantezlere ihtiyaç duyar.
String'leri Birleştirme
+ operatörü string'leri birbirine yapıştırır. + işaretinin herhangi bir tarafı bir string ise, diğer taraf otomatik olarak metne dönüştürülür; böylece sayıları ve boolean'ları hiçbir ek iş yapmadan karıştırabilirsiniz:
Dikkat edilmesi gereken bir nokta: + soldan sağa çalıştığı için "" + 1 + 2 ifadesi "12" üretir (string + int, sonra string + int), ancak 1 + 2 + "" ifadesi "3" üretir (önce iki tam sayı toplanır, sonra metne dönüşür). Tereddüt ettiğinizde, aritmetiği parantez içine alın.
String'ler Değişmezdir (Immutable)
Java string'leri hakkında anlaşılması gereken en önemli şey budur: bir String oluşturulduktan sonra asla değişmez. Bir string'i "değiştiren" her metot aslında bambaşka yeni bir string döndürür ve orijinalini olduğu gibi bırakır. Bu yüzden dönüş değerini yakalamayı unutursanız hiçbir şey olmaz:
İlk çağrı "HELLO" değerini hesaplar ve hemen atar. Yalnızca s'ye geri atama yapan ikinci satırın gözle görülür bir etkisi olur. Bu, neredeyse herkesin bir kez düştüğü bir tuzaktır.
String'leri Karşılaştırma
İki string'in içeriğini karşılaştırmak için .equals() kullanın. =='ye yönelmek klasik bir başlangıç hatasıdır: == "bunlar bellekteki aynı nesne mi?" diye sorar, "aynı metni mi tutuyorlar?" diye değil:
Burada a == b ifadesi false'tur çünkü new String(...) ayrı bir nesne oluşturmaya zorlar. String değerlerini her zaman .equals() ile (ya da büyük/küçük harfi yok saymak için .equalsIgnoreCase() ile) karşılaştırın. Taraflardan biri null olabileceğinde çökmeyi önlemek için kullanışlı bir hile, .equals'i değişmez (literal) üzerinde çağırmaktır: "yes".equals(input), input null olsa bile asla hata fırlatmaz.
Günlük String Metotları
String'ler değişmez olduğundan, bunların her biri orijinali değiştirmek yerine yeni bir string (ya da bir değer) döndürür. Sürekli başvuracağınız metotlar şunlardır:
Zincirlemeye dikkat edin: s.trim().toUpperCase() çalışır çünkü trim() bir string döndürür ve siz de onun üzerinde toUpperCase() çağırırsınız. substring de çok kullanılan bir başka metottur - bir başlangıç indeksi (dahil) ve isteğe bağlı bir bitiş indeksi (hariç) alır:
İndeksler sıfırdan başlar, bu yüzden substring(0, 4) 0'dan 3'e kadar olan karakterleri alır. Sonun ötesinde bir indeks istemek StringIndexOutOfBoundsException fırlatır.
Döngü İçinde String Oluşturma
Birkaç parça için + ile birleştirmek sorun değildir, ancak bunu büyük bir döngü içinde yapmak yavaştır - her + yeni bir string oluşturur ve her şeyi kopyalar. Bir döngüde metin birleştirirken, bir tamponu (buffer) yerinde değiştiren ve sonunda nihai string'i bir kez üreten StringBuilder'ı kullanın:
append aynı builder'ı döndürür, böylece çağrılar zincirlenir. Sonunda normal bir String elde etmek için .toString() çağırın. Tek seferlik birleştirmeler için + ile devam edin; çok sayıda parçayı biriktirmek için doğru araç StringBuilder'dır.
Sırada: String Biçimlendirme
Hizalanmış sütunlara, sabit ondalık basamaklara veya doldurulmuş (padded) sayılara ihtiyaç duyduğunuz anda birleştirme dağınıklaşır. Java'nın String.format ve printf metotları, tüm bunları temiz bir şekilde halletmek için % yer tutucularına sahip bir şablon kullanır - bir sonraki sayfanın konusu bu.
Sıkça Sorulan Sorular
Java'da iki string nasıl karşılaştırılır?
İçerik karşılaştırması için .equals() kullanın: a.equals(b) karakterler eşleştiğinde true döndürür. String değerlerini karşılaştırmak için == kullanmayın - == nesne referanslarını karşılaştırır, bu yüzden aynı metni tutan iki string için false döndürebilir. Büyük/küçük harfin önemli olmadığı durumlarda .equalsIgnoreCase() kullanın.
Java string'leri neden değişmezdir (immutable)?
Bir String nesnesi bir kez oluşturulduktan sonra asla değişemez. replace veya toUpperCase gibi metotlar orijinali değiştirmek yerine yeni bir string döndürür. Değişmezlik, string'leri paylaşmayı ve önbelleğe almayı güvenli kılar, ancak bu, sonucu atamanız gerektiği anlamına gelir: s = s.toUpperCase();. Bir metodu çağırıp dönüş değerini yok sayarsanız hiçbir şey olmaz.
Java'da bir string'in uzunluğu nasıl alınır?
.length() metodunu çağırın: "hello".length() 5 döndürür. String üzerinde parantezli bir metot olduğuna dikkat edin; dizilerin (array) aksine, dizilerde length parantezsiz bir alandır (arr.length).