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

  • ETrade Supply

    ETrade Suppl

    23 Temmuz 2011
  • NicoleGrippo

    NicoleGrippo

    14 Kasım 2006
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005