Translate

8 Ekim 2015 Perşembe

String Equals VS ==



Merhaba arkadaşlar,

Önceki yazımda string'in primitive bir tip olmadığını ve her string için bir nesne örneği yaratıldığını biliyoruz. Bu yazıda farkettiğim ilginç bir trickten bahsedeceğim.

İki nesne örneğini == ile karşılaştırmak istersek sonucun true dönebilmesi için bu örneklerin aynı olması gerekir. Yani bellekteki adresleri aynı olan iki nesne(aslında tek nesne) ancak == sorgusuna true dönebilir. Bunu da genellikle ünlü clone( ) metoduyla açıklarız.

Eğer iki string'in içeriklerinin aynı olmasını kontrol edeceksek equals metodunu kullanırız. Bu bilgilerden ışıkla
public class Test {
public static void main(String[] args) {
 String a=new String("Mehmet Cem YUCEL");
 String b=new String("Mehmet Cem YUCEL");
 System.out.println(a==b);
 System.out.println("equals ? "+a.equals(b));
}
}

yukarıdaki kodu çalıştırdığımızda ekran çıktımız aşağıdaki gibi oluyor.

false
equals ? true

Şimdi ilginç kısıma gelelim.  Peki aşağıdaki kodu çalıştırırsak ekran çıktımız ne olacaktır?

public class Test {
public static void main(String[] args) {
 String a="Mehmet Cem YUCEL";
 String b="Mehmet Cem YUCEL";
 System.out.println(a==b);
 System.out.println("equals ? "+a.equals(b));
}
}

Tahminen false olması gerekir ama böyle sorduğuna göre kesin bir kıllık var dediğinizi duyar gibiyim :) Daha fazla meraklandırmadan cevabı yazalım.
true
equals ? true
Peki niçin ? Sebebi JVM derleme esnasında  "Mehmet Cem YUCEL" karakter setini aynı değişken, hatta daha doğru tabirle sabit gibi alıp a ve b değişkenlerinin bu karakter setini referans etmesini sağlıyor. Yani diğer bir deyişle,
private final static String z="Mehmet Cem YUCEL"; 
String a=z;
String b=z;
olarak çalışıyor. Bunu en güzel şu şekilde anlayabiliriz.
public class Test {
public static void main(String[] args) {
 String a="Mehmet Cem YUCEL";
 String b="Mehmet Cem YUCEL";
 System.out.println(a==b);
 System.out.println("equals ? "+a.equals(b));
 System.out.println(System.identityHashCode(a));
 System.out.println(System.identityHashCode(b));
}
}

Ekran çıktımız ise şu şekilde.
true
equals ? true
19537476
19537476

Yani görebileceğiniz gibi iki farklı String nesnesi aynı bellek adresini gösteriyorlar. Diğer bir deyişle sanki [String].intern( ) metoduyla çoğullanmış gibiler.

Buradan illa bir sonuç çıkarmamız gerekirse, eğer iki stringiniz var ve karşılaştırmak istiyorsak == kullanmıyoruz :)

Herkese bol kodlu günler.
alıntı: http://www.mehmetcemyucel.com/2012/01/string-equals-vs.html

Hiç yorum yok:

Yorum Gönder

Bu Blogda Ara