Найти в Дзене
Y_LAB University

Новый пост Y_LAB Actual | Код под микроскопом

🔍 Продолжаем рубрику, в которой разбираем небольшие фрагменты кода и ищем в них неочевидные особенности, ошибки и подводные камни, которые могут встретиться даже в самых простых на первый взгляд задачах. 📱 Сегодня короткий пример на Java, где всё выглядит логично… но результат может удивить ⬇️ Integer a = 127; Integer b = 127; System.out.println(a == b); Вопрос: Что выведет консоль? Кажется, что ответ очевиден: true И действительно именно таким и будет результат. Но теперь посмотрим на почти такой же код: Integer a = 128; Integer b = 128; System.out.println(a == b); А здесь консоль уже выведет: false ❓ Почему так происходит На первый взгляд оба примера одинаковые: создаются два объекта Integer, которые хранят одно и то же значение. Но дело в том, что Java использует Integer Cache — внутренний механизм кэширования объектов-обёрток для чисел в диапазоне от -128 до 127. Это значит, что в первом примере: Integer a = 127; Integer b = 127; обе переменные ссылаются на один и тот

Новый пост Y_LAB Actual | Код под микроскопом 🔍

Продолжаем рубрику, в которой разбираем небольшие фрагменты кода и ищем в них неочевидные особенности, ошибки и подводные камни, которые могут встретиться даже в самых простых на первый взгляд задачах.

📱 Сегодня короткий пример на Java, где всё выглядит логично… но результат может удивить ⬇️

Integer a = 127;

Integer b = 127;

System.out.println(a == b);

Вопрос:

Что выведет консоль?

Кажется, что ответ очевиден:

true

И действительно именно таким и будет результат.

Но теперь посмотрим на почти такой же код:

Integer a = 128;

Integer b = 128;

System.out.println(a == b);

А здесь консоль уже выведет:

false

❓ Почему так происходит

На первый взгляд оба примера одинаковые: создаются два объекта Integer, которые хранят одно и то же значение.

Но дело в том, что Java использует Integer Cache — внутренний механизм кэширования объектов-обёрток для чисел в диапазоне от -128 до 127.

Это значит, что в первом примере:

Integer a = 127;

Integer b = 127;

обе переменные ссылаются на один и тот же объект в памяти, поэтому:

a == b

возвращает true.

А вот для числа 128 кэш уже не используется, и создаются два разных объекта, поэтому:

a == b

даёт false.

🤔 В чём ошибка?

Оператор == для объектов сравнивает ссылки, а не значения.

Чтобы сравнить сами значения, нужно использовать:

System.out.println(a.equals(b));

И тогда результат будет корректным независимо от числа.

🗂️

Такие мелочи легко пропустить, особенно на собеседованиях или при отладке, а потом долго искать, почему одинаковые числа вдруг «не равны».

Замечали раньше этот подвох с Integer? 👀

#Y_LAB_University #Y_LAB_Actual