Коли ви компілюєте числовий літерал на Java та призначаєте його цілому (капіталу I
), компілятор випускає:
Integer b2 =Integer.valueOf(127)
Цей рядок коду також генерується при використанні автобоксингу.
valueOf
реалізований таким чином, що певні числа "об'єднані", і він повертає той самий екземпляр для значень, менших ніж 128.
З вихідного коду java 1.6, рядок 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Значення high
може бути налаштоване на інше значення із властивістю системи.
-Djava.lang.Integer.IntegerCache.high = 999
Якщо ви запускаєте свою програму із цим системним властивістю, вона виводитиметься правдою!
Очевидний висновок: ніколи не покладайтеся на те, що дві посилання є однаковими, завжди порівнюйте їх із .equals()
методом.
Таким чином b2.equals(b3)
буде надруковано true для всіх логічно рівних значень b2, b3.
Зауважте, що Integer
кеш не існує з міркувань продуктивності, а скоріше, щоб він відповідав JLS, розділ 5.1.7 ; ідентифікатор об'єкта повинен бути вказаний для значень від -128 до 127 включно.
Integer # valueOf (int) також документує таку поведінку:
цей метод, ймовірно, дає значно кращі показники простору та часу, кешуючи часто запитувані значення. Цей метод завжди буде кешувати значення в діапазоні від -128 до 127, включно, і може кешувати інші значення поза цим діапазоном.