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

  • Julian Smith

    Julian Smith

    31 EKİM 2006
  • LearnCode.academy

    LearnCode.ac

    20 Aralık 2012
  • martin shervington

    martin sherv

    7 EKİM 2011