Kısa Cevap
Kilit nokta şudur:
==
iki referans türü arasında her zaman referans karşılaştırmasıdır
- Çoğu zaman, örneğin
Integer
ve ile String
, equals
bunun yerine kullanmak istersiniz
==
referans türü ile sayısal ilkel tür arasında her zaman sayısal karşılaştırmadır
- Referans türü, kutudan çıkarma dönüşümüne tabi tutulacaktır
- Kutudan çıkarma
null
her zaman fırlatırNullPointerException
- Java'nın birçok özel tedavisi
String
olsa da, aslında ilkel bir tür DEĞİLDİR
Yukarıdaki ifadeler, herhangi bir geçerli Java kodu için geçerlidir . Bu anlayışla, sunduğunuz pasajda herhangi bir tutarsızlık yoktur.
Uzun Cevap
İlgili JLS bölümleri şunlardır:
Bir eşitlik operatörünün işlenenlerinin her ikisi de referans türünde veya boş türdeyse , işlem nesne eşitliğidir.
Bu, aşağıdakileri açıklar:
Integer i = null;
String str = null;
if (i == null) {
}
if (str == null) {
}
if (str == "0") {
}
Her iki işlenen de referans türlerdir ve bu nedenle ==
referans eşitlik karşılaştırmasıdır.
Bu aynı zamanda aşağıdakileri de açıklar:
System.out.println(new Integer(0) == new Integer(0));
System.out.println("X" == "x".toUpperCase());
İçin ==
sayısal eşitliğin olması, terimin en az bir sayısal bir türü olmalıdır :
Bir eşitlik operatörünün işlenenlerinin her ikisi de sayısal türdeyse veya biri sayısal türdeyse ve diğeri sayısal türe dönüştürülebilirse , işlenenler üzerinde ikili sayısal yükseltme gerçekleştirilir. İşlenenlerin yükseltilmiş türü int
veya ise long
, o zaman bir tamsayı eşitlik testi gerçekleştirilir; terfi türü float or
double` ise, kayan noktalı eşitlik testi gerçekleştirilir.
İkili sayısal yükseltmenin, değer kümesi dönüştürme ve kutudan çıkarma dönüştürme gerçekleştirdiğini unutmayın.
Bu açıklıyor:
Integer i = null;
if (i == 0) {
}
İşte Etkili Java 2. Baskı, Öğe 49'dan bir alıntı : İlkelleri kutulu ilkellere tercih et :
Özetle, seçiminiz olduğunda kutulu ilkel yerine ilkelleri kullanın. İlkel türler daha basit ve daha hızlıdır. Kutulu ilkelleri kullanmanız gerekiyorsa, dikkatli olun! Otomatik kutulama, kutulu temelleri kullanmanın ayrıntı düzeyini azaltır ancak tehlikeyi azaltmaz. Programınız iki kutulu ilkeli ==
operatörle karşılaştırdığında, bir kimlik karşılaştırması yapar, ki bu neredeyse kesinlikle istediğiniz şey değildir. Programınız kutulu ve kutulu olmayan ilkelleri içeren karma tip hesaplamalar yaptığında, kutudan çıkarma yapar ve programınız kutudan çıkarma yaptığında fırlatabilir NullPointerException
. Son olarak, programınız ilkel değerleri kutuya aldığında, maliyetli ve gereksiz nesne yaratımlarına neden olabilir.
Kutulu ilkelleri kullanmaktan başka seçeneğiniz olmayan yerler vardır, örneğin jenerikler, ancak aksi takdirde kutulu ilkelleri kullanma kararının haklı olup olmadığını ciddi olarak düşünmelisiniz.
Referanslar
İlgili sorular
İlgili sorular