Java'da bir sayı değişmezi derleyip bir Tamsayıya (büyük harf) atadığınızda I
derleyici 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 high
kutu 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.