Kiedy kompilujesz literał liczbowy w Javie i przypisujesz go do Integer (kapitału I
), kompilator emituje:
Integer b2 =Integer.valueOf(127)
Ta linia kodu jest również generowana podczas korzystania z autoboxingu.
valueOf
jest zaimplementowany w taki sposób, że pewne liczby są „łączone” i zwraca to samo wystąpienie dla wartości mniejszych niż 128.
Z kodu źródłowego Java 1.6, wiersz 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Wartość high
można skonfigurować na inną wartość za pomocą właściwości systemowej.
-Djava.lang.Integer.IntegerCache.high = 999
Jeśli uruchomisz program z tą właściwością systemową, wyjdzie prawda!
Oczywisty wniosek: nigdy nie polegaj na tym, że dwa odniesienia są identyczne, zawsze porównuj je z .equals()
metodą.
Więc b2.equals(b3)
wypisze prawdę dla wszystkich logicznie równych wartości b2, b3.
Zauważ, że Integer
pamięć podręczna nie istnieje ze względu na wydajność, ale raczej w celu dostosowania się do JLS, sekcja 5.1.7 ; tożsamość obiektu należy podać dla wartości od -128 do 127 włącznie.
Integer # valueOf (int) również dokumentuje to zachowanie:
metoda ta prawdopodobnie zapewni znacznie lepszą wydajność w zakresie przestrzeni i czasu dzięki buforowaniu często żądanych wartości. Ta metoda zawsze buforuje wartości z zakresu od -128 do 127 włącznie i może buforować inne wartości spoza tego zakresu.