Java’da String karşılaştırması yapmak

Bugün Java’da Stringleri karşılaştırma yöntemleri hakkında azcık kafa yürütüp, hangisinin ne gibi durumlarda kullanılmasının doğru olacağını anlatacağım dostlar.

Kod yazarken bir çok durumda stringlerimizi kıyaslamak durumunda kalıyoruz ve 3 yöntem bulunmakta bunu yapabilmek için; == operatörü, .equals() metodu ve compareTo() metodu.

Örneğin == operatör’ünü ilk kodlamaya başladığımızda sürekli kullandık, hangi dil olursa olsun stringleri, integerları ve diğer değişkenlerimizi hep bu operatör ile karşılaştırmaya çalıştık, peki javada String karşılaştırması yaparken bu ne kadar kullanışlı? .equals ile farkı nedir? gibi sorulara örneklerle cevap vermeye çalışacağım.

Öncelikle == operatöründen başlayalım; bu operatörümüz “referans eşitliğini” kontrol eder, yani kıyasladığımız iki string’imiz aynı object mi değil mi diye bakar.
.equals() ise “değer eşitliğini” kontrol eder, yani kıyaslanan iki string’in mantıksal olarak eşit olup olmadığına bakar.

Mantıksal olarak nasıl çalıştıklarını öğrendikten sonra kullanımlarına geçelim:

1
2
3
4
5
6
7
8
9
10
11
// Bu iki string aynı değere sahipler
new String("deneme").equals("deneme") // true sonucunu verir.

// ... ama aynı object değiller;
new String("deneme") == "deneme" //  false sonucunu verir.

// ... Bu iki string’de aynı object değildir çünkü değerleri aynı iki farklı object oluşturduk.
new String("deneme") == new String("deneme") // --> false sonucunu verir.

// ama bu iki string aynı object’i refer ederler.
"deneme" == "deneme" // --> true değeri döndürür.

Bazı durumlarda ise == operatörü beklenmedik olmasada anlaması zor şekilde çalışabilir, örneğin;

1
2
3
String a = “deneme”;
String b = “deneme”;
İf(a==b) // burada sonucumuz true olacaktır. Peki neden?

Sebebi , javada bir string new operatörü yazılmadan oluşturulduğunda, Java Virtual Machine öncelikle o değişkeni String Havuzunda arar ve bir karşılaşma bulursa, aynı referansı verir yeni String’e. Bu yüzden true sonucunu alırız.

Ama yukarıda da ifade etmeye çalıştığım gibi;

1
2
3
String a="deneme";
String b=new String("deneme");
if (a==b)

ifadesinde ise false alıyoruz, sebebi ise new String ifadesinin Java Heap‘de oluşturulmasıdır.
Burada kısaca heap nedir sorusuna da cevap verelim. Java Heap; Herhangi bir Java sınıfından new operatörü ile bir nesne oluşturulduğunda, bu nesnenin bilgisayarın hafızasında tutulduğu alana verilen addır.

O yüzden b değişkenimiz String Havuzundan değil Heap’den referans aldığı ama a’nın referansı String Havuzunda olduğu için false sonucunun döndürüldüğünü görürüz.

Bir diğer karşılaştırma yöntemimiz ise compareTo() metodudur. Bu diğer anlattığım iki karşılaştırma yönteminden birazcık daha farklı olduğu için kıyaslamaya sokmadım.
Örneğe geçmeden önce nasıl bir mantığı var ona bakalım.
compareTo() metodu, iki string’i kıyaslarken ASCII değerlerine bakarak karşılaştırmasını yapar. O yüzden 3 farklı sonuç elde edebiliriz. Birinci kıyasladığımız Stringler’in değerleri eşit olabilir bu durumda 0 sonucunu döndürür, ikincisi kıyaslamada ilk yazdığımız String değer olarak daha büyükse positif değer yani +1 sonucunu döndürür, üçüncü ihtimal de ilk String’imiz daha küçüktür ve negatif yani -1 sonucunu döndürür.

Örneklerle daha iyi anlaşılacağı için hemen bir örnek yazalım:

1
2
3
4
5
6
String s1="deneme";
String s2="deneme";
String s3="desen";
s1.compareTo(s2); // 0 sonucunu döndürdü.
s1.compareTo(s3); // -1 sonucunu döndürdü.
s3.compareTo(s1); // 1 sonucunu döndürdü.

İlk karşılaştırmamızda, “s1.compareTo(s2);” tamamen aynı harflerden oluştukları için ACSII değerleri de aynıdır ve 0 döndürür.
İkinci karşılaştırmada “s1.compareTo(s3);” ise hesaplamamızı yapmak zorundayız, ilk iki harf aynı olduğu için üçüncü harfe kadar geliriz, int ‘n’ – int ‘s’ dediğimiz zaman n harfinin ASCII değeri daha küçük olduğu için negatif yani -1 sonucunun döndürüldüğünü görürüz.
Üçüncü kıyaslama da ise üstte yaptığım ASCII karşılaştırmasının tersi olduğu için sonuç positif yani 1 dönecektir.

Bugün Java’da String karşılaştırılmasını ufaktan anlatmaya çalıştım, umarım yararlı ve öğretici olmuştur. İyi kodlar dostlar.

ahmet

Ahmet Kılınç - Software Developer

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Önder dedi ki:

    Teşekkürler bilgi için, emeğine sağlık. Bu tarz paylaşımların java core boyutunda yetenekler kazandırmak adına yayınladığınız bilgiler bizler için çok önemli.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.