SORU
3 EKİM 2009, CUMARTESİ


Nasıl düzgün Java iki Tamsayılar karşılaştırmak için?

Eğer bir sabit gibi kutulu ilkel bir Tamsayı karşılaştırırsanız biliyorum:

Integer a = 4;
if (a < 5)

a otomatik olarak Kutusuz olacak ve karşılaştırma çalışması.

Ancak, ne Integers iki kutulu karşılaştırırken olur ve eşitlik ya da daha az büyüktür karşılaştırmak ister misiniz?

Integer a = 4;
Integer b = 5;

if (a == b)

Yukarıdaki kod eğer aynı nesne olup olmadığını görmek için kontrol neden olur, ya da bu durumda otomatik ciltsiz olacak?

Ne hakkında:

Integer a = 4;
Integer b = 5;

if (a < 5)

?

CEVAP
4 EKİM 2009, Pazar


, == Tam sayı arasında, Uzun vb olup olmadığını kontrol ederbaşvuru eşitlik- yani

Integer x = ...;
Integer y = ...;

System.out.println(x == y);

bu x y bakın olup olmadığını kontrol edinaynı nesneyerineeşitnesneler.

Bu yüzden

Integer x = new Integer(10);
Integer y = new Integer(10);

System.out.println(x == y);

baskı için garanti 18**. "Küçük" autoboxed değerleri yanıltıcı sonuçlara yol açabilir: . staj of

Integer x = 10;
Integer y = 10;

System.out.println(x == y);

Bu true, boks kuralları (JLS section 5.1.7) nedeniyle baskı. Hala başvuru eşitlik kullanılıyor, ama bu başvurular gerçekteneşit.

Şahsen ben kullanmak istiyorum:

if (x.intValue() == y.intValue())

ya

if (x.equals(y))

İkincisi ise biraz daha az verimli - yok aşırı için Integer.equals(Integer) bu yüzden olacak için yürütme zamanı tür denetlemesi, oysa ilk kullanan aslında zaten bildiğimiz bu iki nesne Integerler.

Neyse ki, compareTo türleri hakkında biliyor, bu yüzden:

if (x.compareTo(y) < 0)

yine de verimli olmalıdır. Tabii ki, bu mikro-optimizasyon ve net bulduğun kodu kullanmalısınız topraklarına doğru:) emin olduktan sonra

Dediğin gibi, herhangi bir karşılaştırma arasında bir kapsayıcı türü (Integer, Long vs) Ve bir sayısal tür (int, long vb) sarıcı tip değerdirKutusuzve test ilkel değerleri dahil etmek için uygulanır.

Bu ikili sayısal tanıtım (JLS section 5.6.2) bir parçası olarak ortaya çıkar. Her bireyin operatör uygulanan olup olmadığını görmek için belgelerine bakın. Doktorlar == ve= !örneğin, (JLS 15.21.1):

Bir eşitlik varsa işlenen operatör sayısal tür, ya da her ikisi de bir sayısal türü ve diğer Cabrio (§5.1.8) sayısal için. yazın, ikili sayısal promosyon. işlenen (madde 5.6.2) üzerinde yapıldı.

ve < <=, >ve >= (JLS 15.20.1)

Bu işlenen her tür sayısal karşılaştırma operatör olmalı Cabrio (§5.1.8) bir tür ilkel bir sayısal tür, ya da bir derleme zamanı hatası oluşur. İkili sayısal promosyon gerçekleştirilir işlenen (madde 5.6.2). Eğer gönderirse yazın işlenen int veya long. sonra imzalı tamsayı karşılaştırma eğer bu teşvik türü ise gerçekleştirilen; şamandıra veya çift, kayan nokta o zaman karşılaştırma gerçekleştirilir.

Bunların hiçbiri durumun bir parçası olarak kabul edilirikisi de değilsayısal bir türüdür.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Brendan van Son

    Brendan van

    5 Aralık 2006
  • Mary Jane Tauyan

    Mary Jane Ta

    20 AĞUSTOS 2009
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008