SORU
28 HAZİRAN 2010, PAZARTESİ


Garip Tamsayı Java boks

Ben sadece şuna benzer bir kod gördüm:

public class Scratch
{
    public static void main(String[] args)
    {
        Integer a = 1000, b = 1000;
        System.out.println(a == b);

        Integer c = 100, d = 100;
        System.out.println(c == d);
    }
}

Zaman koştu, bu kod bloğu yazdırın

false
true

İki nesne == başvurular karşılaştırır çok ayrı nesneleridir. çünkü ilk false anlıyorum: Ama neden ikinci ifade true dönüyor mu? çözemiyorum Bir Tamsayı değeri belirli bir aralık içinde olduğunda devreye giriyor Bu biraz garip autoboxing kural mı var? Burada neler oluyor?

CEVAP
28 HAZİRAN 2010, PAZARTESİ


true çizgi aslında dil belirtimi tarafından güvence altına alınmıştır. section 5.1.7:

Eğer kutulu olmak p değeri true ise, bir bayt aralığı bir char yanlış \u0000 \u007f, ya da bir int veya kısa -128 ile 127 arasında bir sayı, sonra izin ve her iki sonuç çıkar r1 r2 p boks dönüşüm. Her zaman olduğu r1 == r2 durumda.

Tartışma çıktı ikinci çizgi güvence altına alınmış olsa da, bu ilk değil düşündüren (son paragraf aşağıda alıntı) gider:

İdeal olarak, belirli bir ilkel boks p değeri, her zaman bir verim olur aynı referans. Uygulamada, bu uygun kullanarak mevcut olmayabilir uygulama teknikleri. Kuralları yukarıda pragmatik bir uzlaşma. Bu son fıkra yukarıda gerektirir bazı ortak değerler her zaman kutulu olması nesneleri ayırt edilemez. Bu bu uygulama, tembel önbelleğe ya da hevesle.

Diğer değerler için, bu formülasyon hakkında herhangi bir varsayım izin vermiyor kutulu kimlik değerleri programcı parçası. Bu izin verecek (ama gerekli değil) paylaşım ya tüm bu başvuruları.

Bu en yaygın olarak sağlar doğduğunda davranış olacaktır bir, bir aşırı yüklemeden istenen performans, özellikle ceza küçük cihazlar. Daha az bellek sınırlı uygulamaları, örneğin olabilir, önbellek tüm karakterler ve şort olarak iyi tamsayılar olarak ve uzun -32 k - 32 k aralığı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Canceriansoul

    Canceriansou

    15 Ocak 2011
  • Liam Underwood

    Liam Underwo

    19 Mayıs 2009
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011