Какво се случва при сравняване на Integer a = 127 и int b = 127, както и Integer a1 = 128 и int b1 = 128 в Java? Обяснете защо резултатите от сравнението ще се различават.
sobes.tech AI
Отговор от AI
При сравнение Integer a = 127 и int b = 127 с използване на оператора ==, резултатът ще бъде true. Това се случва поради автоупаковането (autoboxing) на int b в обект Integer, както и защото стойността 127 се намира в диапазона на кешираните обекти Integer (по подразбиране от -128 до 127). Java използва пул от обекти за тези стойности, така че a и опакованият b сочат към един и същи обект.
При сравняване на Integer a1 = 128 и int b1 = 128, резултатът от оператора == ще бъде false. Въпреки че b1 също автоматично се опакова в обект Integer, стойността 128 е извън диапазона на кешираните стойности. Следователно, при автоупаковане се създава нов обект Integer за b1. Референциите a1 и опакованият b1 сочат към различни обекти в купчината, дори ако техните числови стойности са еднакви.
За сравняване на стойностите на обектите-обвивки (като Integer) трябва да се използва методът equals().
// Сравнение на стойности
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (автоупаковане и кеширане на Integer)
System.out.println(a.equals(b)); // true (сравнение на стойности)
Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (автоупаковане, но без кеш за тази стойност)
System.out.println(a1.equals(b1)); // true (сравнение на стойности)
Integer a2 = new Integer(127); // Създаване на нов обект, дори ако стойността е в кеша
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (различни обекти)
System.out.println(a2.equals(a3)); // true (сравнение на стойности)
Следователно, == сравнява референциите към обекти за типовете-обвивки, докато за сравнение на примитивни типове или стойности на обекти-обвивки трябва да се използва equals(). Функцията за кеширане на Integer за диапазона [-128, 127] влияе върху резултата == при работа с числа в този диапазон.