Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi
0 oy
1.5k gösterim

Java'da string, integer vb. objelerde eşitlik kontrolü yapılırken kullanılan bu fonksiyonların farkı nedir?

if (object1.equals(object2)){
}
if (object1 == object2){
}
Java kategorisinde (1.6k puan) sordu
yeniden gösterildi

1 cevap

+3 oy
 
En İyi Cevap
http://stackoverflow.com/questions/7520432/java-vs-equals-confusion sitesinde yazan bilgiye göre

== ile nesnelerin hafızada aynı yeri tutup tutmaması karşılaştırılır.
.equals ile nesnelerin içindeki değerlerin birbirine eşit olup olmaması karşılaştırılır

Ancak burada benim bu açıklamaya bir itirazım var çünkü:

int a=3;
int b=3;

if (a==b) {
  ...
}

Kodunda a ile b değişkenleri hafızada değişik yerlerde tutulmalarına rağmen if koşulundan geçecektir.

Biraz araştırdıktan sonra anladığım şey şu:

Bu operatörlerin davranışı değişkenlerin tipine göre farklılaşmaktadır. Eğer karşılaştırılan nesneler primitive ise değerler karşılaştırılırken, nesne tipinde değişkenler içinse == operatörü ile hafızadaki konumlar karşılaştırılır. Nesne tipindeki değişkenler için .equals çalışma biçimiyse ilgili nesnenin içinde nasıl tanımlandıysa öyle çalışır. Eğer tanımlı değilse türediği sınıftaki equals fonksiyonuna göre çalışır.
(161 puan) cevapladı
seçti
Güzel yerden yakalamışsın.

Normalde java'da karşılaştırma için == kullanılıyor. Eğer karşılaştırdığın değerler boxed/sınıf bazlı değerler ise ilk karşılaştırılabilecek olan değer bu sınıfların içeriği olmuyor. Keza sınıfların içinde birden fazla bilgi bulunacağı için nasıl karşılaştırılması gerektiğini anlamaz derleyici. Bunun yerine sınıf değişkenlerinin gösterdiği adresler aynı mı diye kontrol eder.

Ama yapı itibariyle bakarsan, primitive(ilkel) tipler zaten sınıf bazlı değişkenler değil ve içinde barındırdıkları bilgi bir adres bilgisi değil. Bu yüzden direk olarak değer karşılaştırılması yapılır.  

.equals metoduna gelince, sınıf bazlı veri tiplerini karşılaştırmak istediğin zaman, bir sınıfın iki mensubunu nasıl karşılaştırmalıyız sorusunun cevabı bu metod içinde verilir. Yani sınıfın(class instance, türkçesini bilmiyorum) içindeki hangi alanlar birbirine eşitse bu iki sınıf birbirine eşit denir, bu sorunun cevabını verdiğin alandır. Java da standard olarak iki sınıfı karşılaştıracağı zaman equals metodunu otomatikmen çağırır.
biraz daha somut örnek verebilir misiniz? daha iyi anlamak açısından ufak bir sudo kod vs. olsa iyi olabilir.

İlgili sorular

0 oy
1 cevap 282 gösterim
282 gösterim 18 Aralık 2016 Java kategorisinde tolga (1.6k puan) sordu
0 oy
1 cevap 179 gösterim
179 gösterim 9 Ocak 2017 Java kategorisinde tolga (1.6k puan) sordu
+1 oy
1 cevap 63 gösterim
0 oy
1 cevap 40 gösterim
40 gösterim 30 Mayıs 2017 Java kategorisinde tolga (1.6k puan) sordu
0 oy
1 cevap 22 gösterim
22 gösterim 15 Ocak Java kategorisinde erkanerkisi (207 puan) sordu
...