Arasındaki fark nedir ==
.equals()
Scala ve içindeki ve ne zaman kullanılır?
Uygulama Java ile aynı mı?
EDIT: ilgili soru belirli vakalardan bahseder AnyVal
. Daha genel durum Any
.
Arasındaki fark nedir ==
.equals()
Scala ve içindeki ve ne zaman kullanılır?
Uygulama Java ile aynı mı?
EDIT: ilgili soru belirli vakalardan bahseder AnyVal
. Daha genel durum Any
.
Yanıtlar:
Normalde kullanırsanız ==
, doğru şekilde equals
davranması dışında yönlendirir null
. Referans eşitliği (nadiren kullanılır) eq
.
3 == BigInt(3)
ve BigInt(3) == 3
doğrudur. Ama 3.equals(BigInt(3))
yanlış, oysa BigInt(3).equals(3)
doğrudur. Bu nedenle kullanmayı tercih edin ==
. equals()
Scala kullanmaktan kaçının . Bence ==
örtük dönüşümü iyi yapıyor, ama equals()
değil.
new java.lang.Integer(1) == new java.lang.Double(1.0)
doğru ise new java.lang.Integer(1) equals new java.lang.Double(1.0)
yanlıştır?
equals
Her örneğin içeriğini karşılaştırmak için geçersiz kılma yöntemi. Bu, equals
Java'da kullanılanla aynı yöntemdir==
hakkında endişelenmeden karşılaştırmak için operatörü kullanınnull
eq
Her iki argümanın da tam olarak aynı referans olup olmadığını kontrol etmek için yöntemi kullanın . Bunun nasıl çalıştığını anlamadığınız ve equals
bunun yerine ihtiyacınız olan şey için işe yaramayacağı sürece kullanılmaması önerilir . Ve bunu sadece AnyRef
argümanlarla kullandığınızdan emin olun , sadeceAny
NOT: equals
Java'da olduğu gibi, argümanları değiştirirseniz aynı sonucu döndürmeyebilir, örneğin 1.equals(BigInt(1))
tersin döneceği false
yere dönecektir true
. Bunun nedeni, her uygulamanın yalnızca belirli türleri denetlemesidir. İkinci argüman ait olup olmadığını İlkel numaralar çek yok Number
ne deBigInt
tipte sadece diğer ilkel tiplerde
AnyRef.equals(Any)
Yöntem, alt sınıflar tarafından geçersiz biridir. Java Spesifikasyonundan Scala'ya da gelen bir yöntem. Kutusuz bir örnekte kullanılırsa, bunu çağırmak için kutuludur (Scala'da gizli olsa da; int
-> ile Java'da daha açıktır Integer
). Varsayılan uygulama yalnızca başvuruları karşılaştırır (Java'da olduğu gibi)
Any.==(Any)
Yöntem, iki nesne karşılaştırır ve (iki örneği ile statik bir yöntem çağrı sanki) ya da değişken null olmasını sağlar. Her ikisi de karşılaştırır null
, sonraequals(Any)
kutulu örnekte yöntemi .
AnyRef.eq(AnyRef)
Yöntem karşılaştırır tek örneği belleğinde bulunduğu olduğu, referanslar. Bu yöntem için örtülü bir boks yoktur.
1 equals 2
geri false
yönlendirilirken,Integer.equals(...)
1 == 2
geri false
yönlendirilirken,Integer.equals(...)
1 eq 2
her iki argümanın da tür olmasını gerektirdiğinden derlenmeyecektir AnyRef
new ArrayList() equals new ArrayList()
true
içeriği kontrol ettiği için geri dönecektirnew ArrayList() == new ArrayList()
geri true
yönlendirilirken,equals(...)
new ArrayList() eq new ArrayList()
her false
iki argüman da farklı örnekler olduğu için geri dönecektirfoo equals foo
dönecektir true
sürece, foo
olan null
, daha sonra atacağımNullPointerException
foo == foo
dönecektir true
bile foo
olduğununull
foo eq foo
her true
iki argüman da aynı referansa bağlandığından geri dönecektirArasında ilginç bir fark vardır ==
ve equals
için Float
ve Double
türleri: Bunlar tedavi NaN
farklı:
scala> Double.NaN == Double.NaN
res3: Boolean = false
scala> Double.NaN equals Double.NaN
res4: Boolean = true
Düzenleme: As yorumunda işaret edildi - "Bu da Java olur" - ne olduğuna bağlıdır bu geçerli:
public static void main(final String... args) {
final double unboxedNaN = Double.NaN;
final Double boxedNaN = Double.valueOf(Double.NaN);
System.out.println(unboxedNaN == unboxedNaN);
System.out.println(boxedNaN == boxedNaN);
System.out.println(boxedNaN.equals(boxedNaN));
}
Bu yazdırılacak
false
true
true
Yani, unboxedNan
verimfalse
eşitlik ile karşılaştırıldığında , çünkü IEEE kayan nokta sayıları onu bu şekilde tanımlar ve bu her programlama dilinde (kimlik kavramıyla bir şekilde karıştırılmasına rağmen) gerçekten gerçekleşmelidir.
Kutulu NaN, karşılaştırma için doğrudur. ==
, nesne referanslarını karşılaştırırken Java ile .
equals
Davayla ilgili bir açıklamam yok , IMHO gerçekten ==
kutusuz çifte değerlerle aynı şekilde davranmalı , ama öyle değil.
Scala'ya Any
çevrildi , Scala ilkel ve nesne türlerini ilkel çifte ve kutulu Double'a gerektiği gibi birleştirdiğinden ve çevirdiğinden, biraz daha karmaşıktır . Böylece skala ==
görünüşte ilkel NaN
değerlerin bir karşılaştırmasına kadar kaybolur, ancak equals
kutulu Çift değerlerde tanımlananı kullanır (devam eden çok fazla örtülü dönüşüm sihri vardır veRichDouble
).
Bir şeyin gerçekten NaN
kullanılıp kullanılmadığını gerçekten öğrenmeniz gerekiyorsa isNaN
: