Kotlin'de karşılaştırma için iki operatör bulunmaktadır:
== — yapısal karşılaştırma (.equals() ile eşdeğerdir). İçerikleri kontrol eder: a == b ifadesi a?.equals(b) ?: (b == null) çağrısını tetikler.=== — referans karşılaştırma. Her iki değişkenin aynı nesneye işaret edip etmediğini kontrol eder: a === b ifadesi, Java'daki a == b için nesneler bakımından eşdeğerdir.Temel türler için (örneğin, Int): == ve === otomatik kutulama nedeniyle aynı şekilde davranabilir, ancak genel durumlarda == kullanmak gereklidir.
val a = "Kotlin" val b = "Kotlin" val c = a println(a == b) // true (içerik karşılaştırması) println(a === b) // false (farklı referanslar — dizeler internettir, derleyiciye bağlıdır) println(a === c) // true (aynı nesne)
Kotlin'de a.equals(b) ile a == b arasındaki fark nedir?
Bazı insanlar arasında fark olmadığına dair inanç vardır, ancak eğer a nullable ise, a.equals(b) çağrısı NullPointerException hatası verirken, a == b güvenlidir ve her ikisi de null ise true, sadece biri null ise false değerini döner.
Örnek:
val a: String? = null val b: String? = null println(a == b) // true println(a?.equals(b)) // null (true değil, ama hata değil) println(a.equals(b)) // NullPointerException
Hikaye
Büyük bir projede, nullable dizeleri a.equals(b) üzerinden karşılaştırarak çalışıyordu ve a == null durumunda uygulamanın çökmesi gibi bir durumu fark etmiyorlardı. Hata oldukça nadir tekrarlanıyordu ama prodüksiyonda kritik kazalara yol açıyordu — a == b ile değiştirilerek çözüldü.
Hikaye
Nesneleri === üzerinden karşılaştırırken, içeriğin karşılaştırılacağını bekliyorlardı, ancak === nesnelerin kimliğinin doğru bir şekilde kontrol edilmesini sağlıyordu — anlaşıldı ki, aynı içeriğe sahip iki farklı dize === ile eşit değildir, bu da veri önbellekleme mantığını bozdu.
Hikaye
Boxed Int değerleri (örneğin, koleksiyonlardan) ile çalışırken, geliştiriciler bunları === ile karşılaştırdılar ve farklı sayılar için nesne örneklerinin otomatik kutulama yapılmadığı için beklenmedik sonuçlar aldılar. Bu, nesne koleksiyonları ile çalışırken yanlış davranışlara yol açtı.