ProgramlamaBackend Geliştirici

Kotlin'de '==' ve '===' operatörlerinin çalışma şeklini açıklayın. Nesne ve anlamlı türler arasındaki karşılaştırmanın spesifikası nedir, karşılaştırma sırasında perde arkasında neler oluyor ve eşitlik ile ilgili yaygın hataları nasıl önleyebiliriz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Kod örneği

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)

Kandırmacalı soru.

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

Konuya dair bilgi eksikliği sebebiyle gerçek hataların örnekleri.


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ı.