#java #learning #challenge #відповідь
Цей фрагмент коду Java демонструє цікавий аспект кешування Java Integer і поведінку оператора == під час порівняння об’єктів Integer.
🧐 Давайте розглянемо кожне з чотирьох порівнянь у методі Stream.of:
👉 iEquals(42, 42):
Це порівняння включає два цілі літерали. У Java цілі літерали в діапазоні від -128 до 127 автоматично поміщаються в кешовані об’єкти Integer, коли вони використовуються як об’єкти. Тому оператор ==, який перевіряє рівність посилань, повертає true, оскільки обидва посилання вказують на той самий об’єкт Integer у кеші.
👉 iEquals(42, Integer.valueOf("42")):
Метод Integer.valueOf(String) спочатку перетворює рядок на int, а потім викликає Integer.valueOf(int). Цей метод використовує кеш Integer для значень від -128 до 127. Оскільки 42 знаходиться в цьому діапазоні, метод повертає посилання на кешований об’єкт Integer, який представляє 42. Як і в першому випадку, обидва операнди є посиланнями до того самого кешованого об’єкта, тому == повертає true.
👉 iEquals(42, Integer.valueOf(42)):
Подібно до попереднього випадку, Integer.valueOf(42) поверне посилання на кешований об’єкт Integer, що представляє 42. Знову ж таки, обидва операнди автоматично розміщуються в одному об’єкті Integer з кешу, у результаті == повертає true.
👉 iEquals(42, new Integer(42)):
Тут поведінка змінюється: new Integer(42) явно створює новий об’єкт Integer зі значенням 42, а не використовує кеш Integer. У результаті оператор == тепер порівнює посилання на кешований об’єкт Integer (з автоупакуванням 42 зліва) з посиланням на щойно створений об’єкт Integer (з правого боку). Оскільки це два різні об’єкти в пам’яті, оператор == повертає false.
🤓 Таким чином, перші три порівняння повертають true, оскільки вони порівнюють посилання на той самий кешований об’єкт Integer. Останнє порівняння повертає false, оскільки воно порівнює посилання на кешований об’єкт Integer із посиланням на щойно створений об’єкт Integer. Це підкреслює важливий момент у Java: оператор == перевіряє, чи два посилання вказують на той самий об’єкт, а не те, чи мають два об’єкти однакові значення. Для порівняння значень замість цього слід використовувати метод equals. 👍
До речі, конструктори Integer (такі як new Integer(int a) та new Integer(String s)) вже deprecated починаючи з 9-ої Java. 😉
#learnJava
👍 Ставте лайк і підпишіться, щоб отримати більше головоломок Java та пригод програмування. Щасливого кодування!
🪙☕ Купіть мені каву - допоможіть зібрати кошти для ЗСУ: https://www.buymeacoffee.com/ytkach
💬 Мій телеграм канал: https://t.me/tkach_channel
Слава Україні! 🇺🇦