Co się stanie podczas porównywania Integer a = 127 i int b = 127 oraz Integer a1 = 128 i int b1 = 128 w Java? Wyjaśnij, dlaczego wyniki porównania będą się różnić.
sobes.tech AI
Odpowiedź od AI
Porównując Integer a = 127 i int b = 127 za pomocą operatora ==, wynik będzie true. Dzieje się tak z powodu autoboxingu (autoboxing) int b do obiektu Integer, a także dlatego, że wartość 127 mieści się w zakresie obiektów Integer w pamięci podręcznej (domyślnie od -128 do 127). Java korzysta z puli obiektów dla tych wartości, więc a i opakowany b wskazują na ten sam obiekt.
Porównując Integer a1 = 128 i int b1 = 128, wynik operatora == będzie false. Chociaż b1 jest również automatycznie opakowywany w obiekt Integer, wartość 128 jest poza zakresem pamięci podręcznej. W związku z tym podczas autoboxingu tworzony jest nowy obiekt Integer dla b1. Odwołania a1 i opakowany b1 wskazują na różne obiekty na stercie, nawet jeśli ich wartości liczbowe są identyczne.
Aby porównać wartości obiektów opakowujących (takich jak Integer), należy użyć metody equals().
// Porównanie wartości
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing int i cache'owanie Integer)
System.out.println(a.equals(b)); // true (porównanie wartości)
Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing int, ale brak cache dla tej wartości)
System.out.println(a1.equals(b1)); // true (porównanie wartości)
Integer a2 = new Integer(127); // Tworzenie nowego obiektu, nawet jeśli wartość jest w cache
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (różne obiekty na stercie)
System.out.println(a2.equals(a3)); // true (porównanie wartości)
W związku z tym, == porównuje odwołania do obiektów dla typów opakowujących, podczas gdy do porównania typów prymitywnych lub wartości obiektów opakowujących należy używać equals(). Funkcja cache'owania Integer dla zakresu [-128, 127] wpływa na wynik == podczas pracy z liczbami w tym zakresie.