Java'da bir sayı değişmezi derleyip bir Tamsayıya (büyük harf) atadığınızda Iderleyici yayınlar:
Integer b2 =Integer.valueOf(127)
Bu kod satırı, otomatik boks kullandığınızda da oluşturulur.
valueOf belirli sayıların "havuzda toplanacağı" şekilde uygulanır ve 128'den küçük değerler için aynı örneği döndürür.
Java 1.6 kaynak kodundan satır 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Değeri highkutu sistemi özelliği ile, başka bir değere ayarlanabilir.
-Djava.lang.Integer.IntegerCache.high = 999
Programınızı bu sistem özelliğiyle çalıştırırsanız, çıktı doğru olur!
Açık olan sonuç: Asla özdeş olan iki referansa güvenmeyin, bunları her zaman .equals() yöntemle .
Yani b2.equals(b3) b2, b3'ün tüm mantıksal olarak eşit değerleri için true yazdırılır.
Not Integerönbellek performans nedenleriyle yoktur, bunun yerine uymak için JLS, bölüm 5.1.7 ; -128 ila 127 dahil değerler için nesne kimliği verilmelidir.
Tamsayı # valueOf (int) de bu davranışı belgeler:
bu yöntemin sıkça istenen değerleri önbelleğe alarak önemli ölçüde daha iyi alan ve zaman performansı sağlaması muhtemeldir. Bu yöntem her zaman -128 ila 127 aralığındaki değerleri dahil eder ve bu aralığın dışındaki diğer değerleri önbelleğe alabilir.