public static void main(String[] args) { Integer i1 = -128; Integer i2 = -128; System.out.println(i1 == i2); //На консоль будет выведено:: true }

В Java существует пул целых чисел для значений от -128 до 127 включительно.

Когда вы создаете объект Integer со значением из диапазона выше (например так:: Integer i1 = -128;), то JVM использует следующий алгоритм: 1️⃣Проверяет пул на наличие объекта с таким значением 2️⃣Если есть объект с нужным значением :: возвращает ссылку на существующий объект из пула 3️⃣Если нет объекта с нужным значением :: создает новый объект и помещает его в пул

В примере выше, поскольку мы хотим сравнивать не содержимое объектов типа Integer, а ссылки (адреса объекта в памяти), то мы вместо “i1.equals(i2)” будем использовать “==”.

Как работает пример выше ? 1️⃣При создании i1 = -128 создается объект Integer со значением -128 и помещается в пул 2️⃣При создании i2 = -128 :: JVM находит в пуле уже существующий объект со значением -128 и возвращает ссылку на существующий объект в памяти 3️⃣Обе переменные (i1 и i2) получают ссылку на один и тот же объект в памяти 4️⃣Поэтому сравнение i1 == i2 возвращает true, так как “==” сравнивает адреса объектов в памяти.

Для значений вне диапазона [-128; 127] каждый раз создается новый объект Integer, и “i1 == i2” вернет false, даже если значения одинаковые, так как “==” сравнивает адреса объектов в памяти, а не значения. Для сравнения значений:: надо использовать “i1.equals(i2)”