2012-02-17 15 views
8

Olası yinelenen için: Ben tamsayı nesneler için aşağıdaki == davranış bulduk ve bunu anlamak için başarısız
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?java == Tamsayı

. (Böyle karşılaştırmalar için ise bir kullanması gerektiğini farkındayım, ama ben OCPJP için çalışıyorum ...) kısa On

, == 1000 için beklenen çalışmaları olarak değil, 10.

eski

Integer i1 = 1000; 
Integer i2 = 1000; 
if(i1 != i2) System.out.println("different objects"); 
if(i1.equals(i2)) System.out.println("meaningfully equal"); 

ve bir beklendiği gibi davranır: kod parçası olmasına rağmen

different objects 
meaningfully equal 

sonraki için:

Bu neden oluyor

same object 
meaningfully equal 

Birisi lütfen açıklayabilir:

Integer i3 = 10; 
Integer i4 = 10; 
if(i3 == i4) System.out.println("same object"); 
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

aşağıdaki çıkışa sahiptir?

+1

BTW '-XX ile deneyin: + AggressiveOpts' ve ilk bir saniye olarak davranacaktır gibi Tamsayı önbelleğinin boyutunu artırır. ;) –

cevap

11

Java 5'ten itibaren, sarmalayıcı sınıf önbelleği eklenmiştir. Aşağıdaki, Tamsayı önbelleğinde bulunan bir iç sınıf olan IntegerCache tarafından oluşturulan önbelleğin incelenmesidir.

Integer myNumber = 10 

veya

Integer myNumber = Integer.valueOf(10); 

256 tamsayı nesnelerin her bir tamsayı dizisi saklanır -128 ile 127 aralığında oluşturulur: Örneğin, aşağıdaki kod, bir önbellek oluşturacaktır. Bu önbelleğe alma işlevi, IntegerCache içinde bulunan IntegerCache iç sınıfına bakarak görülebilir:

Integer.valueOf kullanarak bir nesne oluştururken veya -128 ila 127 aralığında bir Tamsayıya doğrudan atama yaparken aynı nesne iade edilecektir.

Integer i = 100; 
Integer p = 100; 
if (i == p) 
    System.out.println("i and p are the same."); 
if (i != p) 
    System.out.println("i and p are different."); 
if(i.equals(p)) 
    System.out.println("i and p contain the same value."); 

çıkışı: Bu nedenle, şu örneği düşünün Onlar aynı nesne olduğu için ben ve p tek gerçek denk nesneyi dikkat etmek önemlidir

i and p are the same. 
i and p contain the same value. 

, karşılaştırma değil değere göre, nesne eşitliğine dayanır. Tamsayı i ve p, -128 veya 127 aralığının dışındaysa, önbellek kullanılmaz, bu nedenle yeni nesneler oluşturulur. Değer için bir karşılaştırma yaparken daima “.equals” yöntemini kullanın. Ayrıca, bir Tamsayıyı başlatmanın bu önbelleğe almayı engellemediğini de unutmamak gerekir.

“==” her zaman nesne eşitlik için kullanıldığını unutmayın, bu karşılaştırarak kutusuz değerleri için aşırı edilmemiştir