Sobes.tech
Middle

Kas notiks, salīdzinot Integer a = 127 un int b = 127, kā arī Integer a1 = 128 un int b1 = 128 Java? Izskaidrojiet, kāpēc salīdzinājuma rezultāti būs atšķirīgi.

sobes.tech AI

Atbilde no AI

Salīdzinot Integer a = 127 un int b = 127, rezultāts būs true. Tas notiek automātiskās iepakošanas (autoboxing) dēļ, kad int b tiek pārveidots par Integer objektu, kā arī tāpēc, ka vērtība 127 atrodas Integer kešatmiņas (cache) objektu diapazonā (pēc noklusējuma no -128 līdz 127). Java izmanto objektu baseinu šīm vērtībām, tāpēc a un automātiski iepakotais b norāda uz to pašu objektu.

Salīdzinot Integer a1 = 128 un int b1 = 128, operatora == rezultāts būs false. Lai gan b1 arī tiek automātiski iepakots Integer, vērtība 128 nav iekļauta kešatmiņas diapazonā. Tādēļ iepakošanas laikā tiek izveidots jauns Integer objekts b1. Atsauces a1 un iepakojais b1 norāda uz dažādiem objektiem atmiņā, neskatoties uz to, ka to skaitliskās vērtības ir vienādas.

Lai salīdzinātu objektu iepakojuma vērtības (piemēram, Integer), ir jāizmanto equals() metode.

// Vērtību salīdzināšana
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (automātiskā iepakošana un kešatmiņas izmantošana)
System.out.println(a.equals(b)); // true (vērtību salīdzināšana)

Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (automātiskā iepakošana, bet kešatmiņa neattiecas uz šo vērtību)
System.out.println(a1.equals(b1)); // true (vērtību salīdzināšana)

Integer a2 = new Integer(127); // jauna objekta izveide, pat ja vērtība ir kešatmiņā
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (atšķirīgi objekti)
System.out.println(a2.equals(a3)); // true (vērtību salīdzināšana)

Tādējādi, == salīdzina objektu norādes, bet primitivus tipus vai objektu vērtības salīdzināšanai ir jāizmanto equals() metode. Integer kešatmiņa diapazonā [-128, 127] ietekmē == rezultātu, strādājot ar šiem skaitļiem.