Проверяет понимание особенностей сравнения объектов-обёрток в Java через оператор == и правильного сравнения их значений.
В Java оператор == сравнивает ссылки на объекты, а не их содержимое. Объекты-обёртки, такие как Integer, Boolean, Character и другие, являются полноценными объектами. Когда вы сравниваете две переменные типа Integer с помощью ==, вы проверяете, указывают ли они на один и тот же объект в памяти, а не равны ли их числовые значения.
Однако Java использует кэширование для некоторых значений обёрток (например, для Integer от -128 до 127). Это означает, что при автоупаковке (autoboxing) в этом диапазоне создаются одни и те же объекты, поэтому == может вернуть true. Для значений вне этого диапазона создаются новые объекты, и == вернёт false, даже если числовые значения равны.
Для сравнения значений объектов-обёрток всегда используйте метод equals(), который переопределён в каждом классе-обёртке для сравнения содержимого. Также можно использовать метод intValue() для примитивных типов, но это менее удобно.
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true, так как оба в кэше
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // false, разные объекты
System.out.println(c.equals(d)); // true, значения равны
// Сравнение с примитивом
int e = 200;
System.out.println(c == e); // true, автораспаковкаДля надёжного сравнения значений объектов-обёрток всегда используйте метод equals(), чтобы избежать неожиданных результатов из-за кэширования и сравнения ссылок. Это особенно важно при работе с коллекциями и в условиях, где значения могут выходить за пределы кэшируемого диапазона.