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(), інакше всі ставки відключені.