Java’da String karşılaştırma yaparken temel ayrım şudur: == iki String değişkeninin aynı nesneye, yani aynı referansa işaret edip etmediğini kontrol eder. equals() ise String nesnelerinin taşıdığı karakter dizisinin içeriğini karşılaştırır. Bu nedenle ekranda aynı görünen iki metni karşılaştırmak istiyorsan çoğu durumda equals() kullanmalısın.
Bunu iki aynı kitaba benzetebilirsin: Kitapların içindeki metin aynı olabilir; ancak ellerindeki kitaplar fiziksel olarak farklı iki nesne olabilir. == “Elimdeki kitap tam olarak aynı kitap mı?” sorusuna, equals() ise “İçindeki yazı aynı mı?” sorusuna yakındır. == her zaman yanlış değildir; gerçekten iki değişkenin aynı nesneyi gösterip göstermediğini bilerek kontrol etmek istediğin durumlarda anlamlı olabilir. Fakat kullanıcı adı, menü seçimi veya komut gibi metinlerin içeriğini karşılaştırırken tercih genellikle equals() olmalıdır.
Java’da String karşılaştırırken temel fark nedir?
Bir String değişkeni, metnin kendisini doğrudan “kutunun içinde” tutan basit bir etiket gibi düşünülmemelidir. Değişken, bellekte bulunan String nesnesine ulaşmak için kullanılan bir referanstır. Bu yüzden iki değişken aynı karakterleri taşısa bile aynı nesneyi göstermeyebilir.
| Operatör/metot | Neyi karşılaştırır? | Tipik kullanım |
|---|---|---|
== |
Referansların aynı nesneyi gösterip göstermediğini | Aynı nesneye işaret etme durumunu kontrol etmek |
equals() |
String karakterlerinin içerik olarak eşit olup olmadığını | Kullanıcı girdisi veya metin karşılaştırmak |
Örneğin aşağıdaki kodda iki değişkenin metni aynı görünür:
String cevap1 = "evet";
String cevap2 = new String("evet");
System.out.println(cevap1 == cevap2);
System.out.println(cevap1.equals(cevap2));
Bu kodun beklenen çıktısı şöyledir:
false
true
İlk sonuç, değişkenlerin farklı String nesnelerine işaret edebildiğini; ikinci sonuç ise nesnelerin içerdiği karakterlerin aynı olduğunu gösterir. Metin karşılaştırma mantığını temelden öğrenmek isteyenler, Java özel ders programı içinde bu tür referans ve içerik ayrımlarını uygulamalı örneklerle çalışabilir.
== neden bazı String örneklerinde doğru gibi görünür?

== kullanımının kafa karıştırmasının nedeni, bazı String değerlerinde iki değişkenin aynı referansı gösterebilmesidir. Özellikle doğrudan yazılan String literal değerlerinde bu durum gözlemlenebilir:
String a = "merhaba";
String b = "merhaba";
System.out.println(a == b);
System.out.println(a.equals(b));
Bu örnekte iki sonuç da true görünebilir. Ancak bu davranış, “aynı yazıya sahip her String için == doğrudur” anlamına gelmez. Bir değer new String() ile oluşturulduğunda veya uygulama dışından, örneğin kullanıcı girdisi olarak geldiğinde referans ilişkisi farklı olabilir.
String komut = new String("merhaba");
System.out.println(a == komut);
System.out.println(a.equals(komut));
Beklenen çıktı:
false
true
Buradaki önemli sonuç şudur: Ekranda aynı görünen metinlere bakarak referansların aynı olduğu çıkarılamaz. Kullanıcıdan gelen bir değer, dosyadan okunan metin veya başka bir metot tarafından döndürülen String için içerik karşılaştırması gerekiyorsa == yerine equals() kullanmak daha doğru ve güvenilir yaklaşımdır.
if koşullarında yanlış String karşılaştırması nasıl düzeltilir?
Bir metnin içeriğini karşılaştırmak istiyorsan == yerine equals() kullanmalısın. Örneğin aşağıdaki kullanım, secim değişkeninin içeriğini değil, iki String nesnesinin referansını karşılaştırdığı için güvenilir değildir:
if (secim == "1") {
System.out.println("Birinci seçenek seçildi.");
}
İçerik karşılaştırması için değişken üzerinden equals() çağırabilirsin:
if (secim.equals("1")) {
System.out.println("Birinci seçenek seçildi.");
}
Ancak secim değişkeninin null olma ihtimali varsa bu kullanım NullPointerException oluşturabilir. Daha güvenli yaklaşım, sabit String değerinden equals() çağırmaktır:
if ("1".equals(secim)) {
System.out.println("Birinci seçenek seçildi.");
}
Burada secim değeri null olsa bile "1".equals(secim) ifadesi hata vermez; yalnızca false sonucunu üretir.
Büyük-küçük harf farkının önemli olmadığı durumlarda equalsIgnoreCase() kullanılabilir:
if ("evet".equalsIgnoreCase(cevap)) {
System.out.println("İşlem onaylandı.");
}
Örneğin “Evet”, “EVET” ve “evet” aynı kabul edilecekse bu metot uygundur. Kullanıcının tam olarak belirli bir metin girmesi gerekiyorsa normal equals() tercih edilmelidir.
Hata teşhisi için kısa liste
- Değişkenin gerçekten
Stringtüründe olup olmadığını kontrol et. - Amacının referansları mı, metinsel içeriği mi karşılaştırmak olduğunu belirle.
- Değişkenin
nullolma ihtimalini değerlendir. - Büyük-küçük harf duyarlılığı gerekiyorsa
equals(), gerekmiyorsaequalsIgnoreCase()kullan. - Beklenen değer, boş metin, farklı harf kullanımı ve beklenmeyen girişlerle test yap.
Menü seçimi alan mini konsol uygulaması: hatalı ve güvenli sürüm

Aşağıdaki örnekte kullanıcıdan bir menü seçimi alınır. Hatalı sürümde == kullanıldığı için program bazı çalıştırmalarda beklenen sonucu vermeyebilir. Çünkü karar, girilen metnin içeriği yerine referans karşılaştırmasına dayanır.
import java.util.Scanner;
public class HataliMenu {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Seçiminiz: ");
String secim = scanner.nextLine();
if (secim == "1") {
System.out.println("Yeni kayıt seçildi");
} else {
System.out.println("Geçersiz seçim");
}
}
}
Test senaryosu 1: Klavyeden 1 girildiğinde beklenen çıktı bazı çalıştırmalarda alınamayabilir:
Seçiminiz: 1
Geçersiz seçim
Güvenli sürümde ise karşılaştırma doğrudan String içeriği üzerinden yapılır:
import java.util.Scanner;
public class GuvenliMenu {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Seçiminiz: ");
String secim = scanner.nextLine();
if ("1".equals(secim)) {
System.out.println("Yeni kayıt seçildi");
} else if ("2".equals(secim)) {
System.out.println("Kayıtlar görüntülendi");
} else {
System.out.println("Geçersiz seçim");
}
}
}
Test senaryosu 1: Klavyeden 1 girildiğinde:
Seçiminiz: 1
Yeni kayıt seçildi
Test senaryosu 2: Başında veya sonunda boşluk bulunan bir değer ya da farklı bir metin girildiğinde:
Seçiminiz: 1
Geçersiz seçim
Bu sürüm, girilen değeri otomatik olarak değiştirmeden tam içerik karşılaştırması yapar. Boşlukları kabul etmek istiyorsan ayrıca trim() gibi bir işlem tasarlaman gerekir; fakat bu karar, programın beklediği giriş biçimine göre bilinçli verilmelidir.
String karşılaştırmasını seçmek için kısa karar ağacı
Java’da hangi karşılaştırma yöntemini kullanacağını belirlemek için önce karşılaştırmanın amacını netleştir. Aşağıdaki kısa karar ağacı, çoğu başlangıç seviyesi senaryoda doğru seçimi yapmana yardımcı olur:
- İki değerin metni aynı mı? Metinlerin karakter karakter aynı olup olmadığını kontrol ediyorsan
equals()kullan. - Büyük-küçük harf önemsiz mi? Örneğin
"evet"ile"EVET"aynı kabul edilecekseequalsIgnoreCase()kullan. - Karşılaştırılan değişken null olabilir mi? Karşılaştırmayı sabit bir String üzerinden başlat:
"Tamam".equals(deger). Böylecedegernull olsa bile hata oluşmaz. - Aynı nesne veya referans mı? Amacın iki değişkenin aynı nesneyi gösterip göstermediğini anlamaksa
==kullanılabilir.
Bu ağacı üç satırda şöyle özetleyebilirsin:
- Metin içeriği aynı mı?
equals() - Metin aynı, harf farkı önemsiz mi?
equalsIgnoreCase() - Aynı nesneye mi işaret ediyor? Bilinçli olarak
==
Kararı gözlemlemek için kısa testler
Aynı metni taşıyan iki ayrı String değişkeni oluşturarak içerik ve referans karşılaştırmasını ayrı ayrı gözlemleyebilirsin:
String birinci = new String("Java");
String ikinci = new String("Java");
System.out.println(birinci.equals(ikinci));
System.out.println(birinci == ikinci);
Beklenen mantıksal sonuç, ilk satırda true, ikinci satırda ise false değeridir. Çünkü iki değişkenin metinsel içeriği aynıdır; ancak == içerik eşitliğini değil, aynı referansın kullanılıp kullanılmadığını kontrol eder.
Kullanıcıdan gelen bir seçimi kontrol ederken karşılaştırmayı equals() ile yapabilirsin:
String secim = "1";
System.out.println("1".equals(secim));
Burada beklenen sonuç true değeridir. Kullanıcının girdiği değer "1" ise sabit metinle aynı içerik karşılaştırılır. Değişkenin null olabileceği bir durumda da güvenli kullanım şöyledir:
String deger = null;
System.out.println("Tamam".equals(deger));
Bu testin sonucu false olur; program null değer nedeniyle hata vermez. Çünkü equals() çağrısı null olma ihtimali bulunmayan sabit String üzerinden başlatılmıştır.
Kodunu kontrol etmek için pratik test listesi
Kendi if koşullarını incelerken aşağıdaki kontrol listesini kullanabilirsin:
- String içeriğini karşılaştıran koşullarda
==kullanılmış mı? - Karşılaştırılan değişkenin null olma ihtimali var mı?
- Büyük-küçük harf farkı anlam taşıyor mu?
- Kullanıcı girdisinde başta veya sonda beklenmeyen boşluklar oluşabilir mi?
- Kullanıcı farklı harf biçimleriyle aynı seçimi yazarsa sonuç ne olmalı?
ifveelsedallarının her biri için beklenen çıktı önceden yazıldı mı?
Kullanıcı girdisini test ederken yalnızca beklenen değeri değil, boşluk ve harf farklarını da ayrı ayrı dene. Örneğin "Tamam", "tamam" ve " Tamam " girdileri için programın aynı sonucu verip vermeyeceğine önceden karar ver. Java temellerindeki eksiklerini görmek için Java bilgi testi çözmek de yararlı bir kontrol adımı olabilir.
Ana kural şudur: İçerik karşılaştırması yapıyorsan çoğunlukla equals(), büyük-küçük harf önemli değilse equalsIgnoreCase() kullan. == ise yalnızca referans kimliğini kontrol etmek istediğinde, yani bilinçli bir tercihle kullanılmalıdır.
Sık Sorulan Sorular
Java’da String karşılaştırmak için neden == yerine equals() kullanılır?
== iki String’in aynı referansı gösterip göstermediğini kontrol eder. equals() ise String değerlerinin, yani metinsel içeriklerinin aynı olup olmadığını karşılaştırır. Bu nedenle kullanıcı girdisi veya farklı kaynaklardan gelen metinlerde içerik kontrolü için equals() tercih edilir.
String değişkeni null olabileceğinde en güvenli equals() kullanımı nedir?
Null olma ihtimali bulunmayan sabit String üzerinden equals() çağırabilirsin: "Tamam".equals(deger). Böylece deger null olsa bile karşılaştırma hata vermeden false sonucu üretir.
equals() ile equalsIgnoreCase() arasındaki fark nedir?
equals() içerikle birlikte büyük-küçük harf farkını da dikkate alır. equalsIgnoreCase() ise harflerin büyük veya küçük yazılmasını önemsemeden metinleri karşılaştırır.
Java’da == ile String karşılaştırmak ne zaman anlamlı olabilir?
İki değişkenin aynı String nesnesine veya aynı referansa işaret edip etmediğini özellikle kontrol etmek istediğinde == anlamlıdır. Ancak amacın yalnızca metinlerin aynı olup olmadığını anlamaksa equals() kullanmalısın.
String karşılaştırmalarında önce neyi ölçtüğünü belirle: metin içeriğini mi, yoksa referans kimliğini mi? Doğru operatör seçimi, küçük görünen ancak programın kararlarını doğrudan etkileyen hataları önler.