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
yukarıdaki kodu çalıştırdığımızda ekran çıktımız aşağıdaki gibi oluyor.
Şimdi ilginç kısıma gelelim. Peki aşağıdaki kodu çalıştırırsak ekran çıktımız ne olacaktır?
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.
Ekran çıktımız ise şu şekilde.
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.
Ö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 ? truePeki 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,
olarak çalışıyor. Bunu en güzel şu şekilde anlayabiliriz.private final static String z="Mehmet Cem YUCEL";String a=z;String b=z;
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