Фото: Raph Howald на Unsplash
🔥Вступ
Порівняння двох однакових цілих чисел (наприклад, 128) може повернути false
у Java, що може здатися дивним. Причиною такої поведінки є те, як Java обробляє кешування цілих чисел та автозаміну (autoboxing).
🦀Проблема
Integer x = 1;
Integer y = 1;
System.out.println(x == y); // true
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // false
🦀Автозаміна (Autoboxing)
- Автозаміна (Autoboxing) — це особливість Java, яка автоматично перетворює примітивні типи даних (як-от
int
) у відповідні обгортки (наприклад,Integer
) і навпаки.
int x = 5; // (примітивний тип)
Integer y = new Integer(5); // (обгортка)
Integer z = 5; // (автозаміна: int до Integer)
🦀Кешування цілих чисел (Integer Caching)
- Для підвищення продуктивності Java зазвичай кешує малі значення цілих чисел (зазвичай у діапазоні від -128 до 127) у пулі.
- Коли ви використовуєте ціле число в цьому діапазоні, JVM часто повертає кешований об'єкт замість того, щоб створювати новий об'єкт
Integer
.
🦀Чому 1==1 завжди true?
- Коли ви порівнюєте
1==1
, ви порівнюєте два примітивних значенняint
. - Порівняння примітивних типів просте й завжди дає очікуваний результат (
true
у цьому випадку).
🦀Чому 128==128 може бути false?
- Коли ви порівнюєте
128==128
, насправді ви порівнюєте два об'єкти типуInteger
через автозаміну (autoboxing). - Оскільки 128 знаходиться за межами звичного діапазону кешування, JVM може створити два окремі об'єкти
Integer
для цих двох літералів. - Оскільки це різні об'єкти в пам'яті, навіть якщо вони містять однакове значення, оператор
==
порівнює їхні посилання на об'єкти, які різні. Тому порівняння даєfalse
.
🦀Висновок
Дивна поведінка 128==128
у Java підкреслює важливість розуміння автозаміни та кешування цілих чисел. Хоча ==
працює для порівняння примітивів, важливо використовувати метод equals()
, коли порівнюєте об'єкти, щоб переконатися, що ви порівнюєте їхні значення, а не їхні адреси в пам'яті.
Сподіваюся, що цей блог був корисним для вас!
👏Плескайте, якщо вам сподобався цей блог. Слідкуйте та підписуйтеся на мої майбутні пости.
💬Залишайте коментарі, якщо у вас є питання ❓ або пропозиції 💡.
🤝Зв'язуйтеся зі мною на X
🗒️Можливо, вам буде цікаво: List.of() vs Arrays.asList() в Java
Перекладено з: Mind-boggling: Why 1==1 is True but 128==128 is False in Java