Sobes.tech
Middle

Čo sa stane pri porovnaní Integer a = 127 a int b = 127, ako aj Integer a1 = 128 a int b1 = 128 v Jave? Vysvetlite, prečo budú výsledky porovnania odlišné.

sobes.tech AI

Odpoveď od AI

Pri porovnaní Integer a = 127 a int b = 127 s použitím operátora == bude výsledok true. To je spôsobené autoboxingom (autoboxing) int b do objektu Integer, ako aj tým, že hodnota 127 sa nachádza v rozsahu cacheovaných objektov Integer (štandardne od -128 do 127). Java používa pool objektov pre tieto hodnoty, takže a a zabalený b odkazujú na ten istý objekt.

Pri porovnaní Integer a1 = 128 a int b1 = 128 bude výsledok operátora == false. Hoci sa aj b1 automaticky zabaluje do objektu Integer, hodnota 128 je mimo rozsahu cache. Preto sa pri autoboxingu vytvorí nový objekt Integer pre b1. Referencie a1 a zabalený b1 odkazujú na rôzne objekty na halde, aj keď ich číselné hodnoty sú rovnaké.

Na porovnanie hodnôt wrapperových objektov (ako Integer) je potrebné použiť metódu equals().

// Porovnanie hodnôt
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing a cacheovanie `Integer`)
System.out.println(a.equals(b)); // true (porovnanie hodnôt)

Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing, ale bez cache pre túto hodnotu)
System.out.println(a1.equals(b1)); // true (porovnanie hodnôt)

Integer a2 = new Integer(127); // Vytvorenie nového objektu, aj keď je hodnota v cache
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (rôzne objekty)
System.out.println(a2.equals(a3)); // true (porovnanie hodnôt)

Takže, == porovnáva referencie objektov pre wrapperové typy, zatiaľ čo na porovnanie primitívnych typov alebo hodnôt wrapperových objektov je potrebné použiť equals(). Funkcia cacheovania Integer pre rozsah [-128, 127] ovplyvňuje výsledok == pri práci s číslami v tomto rozsahu.