Podczas kompilowania numer dosłowne w Javie i przypisać go do Integer (kapitału I
) kompilator emituje:
Integer b2 =Integer.valueOf(127)
Ta linia kodu jest również generowany podczas korzystania autoboxing.
valueOf
jest realizowana w taki sposób, że niektóre numery są „łączone” i zwraca tę samą instancję do wartości mniejszej niż 128.
z kodu źródłowego Java 1.6, linia 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że zostać skonfigurowana do innej wartości z właściwością systemową.
-Djava.lang.Integer.IntegerCache.high = 999
Jeśli uruchomić program z tej właściwości systemu, to będzie prawdziwa moc!
Oczywisty wniosek: nigdy nie należy polegać na identycznych dwóch referencjach, zawsze należy je porównywać z metodą .equals()
.
Tak więc b2.equals(b3)
wyświetli wartość true dla wszystkich logicznie równych wartości b2, b3.
Należy pamiętać, że pamięć podręczna Integer nie występuje ze względów wydajnościowych, ale raczej z powodu zgodności z JLS, section 5.1.7; tożsamość obiektu musi być podana dla wartości od -128 do 127 włącznie.
Integer#valueOf(int) dokumentuje również ten problem:
ta metoda jest prawdopodobne, uzyskując znacznie lepszą wydajność czasie i przestrzeni poprzez buforowanie często żądane wartości. Ta metoda zawsze będzie buforować wartości w zakresie od -128 do 127 włącznie i może buforować inne wartości poza tym zakresem.
Można znaleźć http://bexhuff.com/2006/11/java-1-5-autoboxing-wackyness pouczające. –
jak doszło do tego, aby zadać to pytanie? to jest naprawdę zabawne, ale nigdy nie natrafiamy na coś takiego "w prawdziwym świecie" ... lub? –
http://stackoverflow.com/a/11882284/57695 –