Integer
Клас має статичний кеш, який зберігає 256 спеціальних Integer
об'єктів - по одному для кожного значення між -128 і 127. Маючи це на увазі, розглянемо різницю між цими трьома.
new Integer(123);
Це (очевидно) робить абсолютно новий Integer
об’єкт.
Integer.parseInt("123");
Це повертає int
примітивне значення після розбору String
.
Integer.valueOf("123");
Це складніше, ніж інші. Він починається з аналізу синтаксису String
. Потім, якщо значення знаходиться між -128 і 127, воно повертає відповідний об'єкт із статичного кешу. Якщо значення знаходиться за межами цього діапазону, воно викликає new Integer()
та передає значення, щоб ви отримали новий об'єкт.
Тепер розглянемо три вирази у питанні.
Integer.valueOf("127")==Integer.valueOf("127");
Це повертає істину, оскільки Integer
значення, значення якого 127, отримується двічі зі статичного кешу та порівнюється із самим собою. Задіяний лише один Integer
об’єкт, тому цей повертається true
.
Integer.valueOf("128")==Integer.valueOf("128");
Це повертається false
, тому що 128 не знаходиться в статичному кеші. Отже, створюється нове Integer
для кожної сторони рівності. Оскільки є два різних Integer
об’єкти, а ==
для об’єктів повертається лише true
якщо обидві сторони є абсолютно однаковим об'єктом, це і буде false
.
Integer.parseInt("128")==Integer.valueOf("128");
Це порівнюючи примітивне int
значення 128 зліва, з новоствореним Integer
об’єктом праворуч. Але оскільки не має сенсу порівнювати показник int
з Integer
аналогічним, Java автоматично розблокує Integer
попереднє порівняння; тож ви закінчуєте порівнювати int
з a int
. Оскільки примітивний 128 дорівнює собі, це повертається true
.
.equals()
, інакше всі ставки відключені.