Co se stane při porovnání Integer a = 127 a int b = 127, stejně jako Integer a1 = 128 a int b1 = 128 v Javě? Vysvětlete, proč budou výsledky porovnání odlišné.
sobes.tech AI
Odpověď od AI
Při porovnávání Integer a = 127 a int b = 127 pomocí operátoru == bude výsledek true. K tomu dochází kvůli autoboxingu (autoboxing) int b do objektu Integer, a také proto, že hodnota 127 se nachází v rozsahu objektů Integer v cache (výchozí od -128 do 127). Java používá pool objektů pro tyto hodnoty, takže a a zabalený b odkazují na stejný objekt.
Při porovnávání Integer a1 = 128 a int b1 = 128 bude výsledek operátoru == false. Ačkoliv je b1 také automaticky zabalen do objektu Integer, hodnota 128 je mimo rozsah cache. Proto při autoboxingu je vytvořen nový objekt Integer pro b1. Odkazy a1 a zabalený b1 odkazují na různé objekty na haldě, i když jejich číselné hodnoty jsou shodné.
Pro porovnání hodnot wrapperových objektů (například Integer) je třeba použít metodu equals().
// Porovnání hodnot
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing a cacheování Integer)
System.out.println(a.equals(b)); // true (porovnání hodnot)
Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing, ale bez cache pro tuto hodnotu)
System.out.println(a1.equals(b1)); // true (porovnání hodnot)
Integer a2 = new Integer(127); // Vytvoření nového objektu, i když je hodnota v cache
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (různé objekty)
System.out.println(a2.equals(a3)); // true (porovnání hodnot)
Tedy, == porovnává reference objektů u wrapperových typů, zatímco pro porovnání primitivních typů nebo hodnot wrapperových objektů je třeba použít equals(). Funkce cacheování Integer v rozsahu [-128, 127] ovlivňuje výsledek == při práci s čísly v tomto rozsahu.