Вражаюче: чому 1==1 — це true, а 128==128 — false в Java

pic

Фото: 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

Leave a Reply

Your email address will not be published. Required fields are marked *