Sobes.tech
Middle

Ինչ տեղի կունենա Java-ում, երբ համեմատենք Integer a = 127 և int b = 127, ինչպես նաև Integer a1 = 128 և int b1 = 128։ բացատրեք, թե ինչու կլինեն համեմատության արդյունքները տարբեր։

sobes.tech AI

Պատասխան AI-ից

Երբ համեմատում ենք Integer a = 127 և int b = 127 օգտագործելով == օպերատորը, արդյունքը կլինի true: Դա տեղի է ունենում int b-ի ավտոապակսինգի (autoboxing) պատճառով Integer օբյեկտի և այն պատճառով, որ 127 արժեքը գտնվում է Integer օբյեկտների կեշային տիրույթում (առանցքային՝ -128-ից մինչև 127): Java-ն օգտագործում է օբյեկտների պուլ այս արժեքների համար, ուստի a և b-ն, որոնք փաթեթավորված են, ցույց են տալիս նույն օբյեկտին:

Երբ համեմատում ենք Integer a1 = 128 և int b1 = 128, == օպերատորի արդյունքը կլինի false: Թեև b1-ը նույնպես ավտոմատ կերպով փաթեթավորվում է Integer օբյեկտի, արժեքը 128 հեռու է կեշային տիրույթից: Հետևաբար, ավտոապակսինգի ժամանակ ստեղծվում է նոր Integer օբյեկտ b1-ի համար: a1 և փաթեթավորված b1-ը ցույց են տալիս տարբեր օբյեկտներին հոսթում, նույնիսկ եթե նրանց թվային արժեքները նույնն են:

Վերահսկելու համար Integer-ի նման օբյեկտների արժեքները, պետք է օգտագործել equals() մեթոդը:

// Արժեքների համեմատություն
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing և `Integer` կեշավորում)
System.out.println(a.equals(b)); // true (արժեքների համեմատություն)

Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing, բայց առանց կեշի)
System.out.println(a1.equals(b1)); // true (արժեքների համեմատություն)

Integer a2 = new Integer(127); // Նոր օբյեկտ ստեղծվում է, նույնիսկ եթե արժեքը կեշում է
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (տարբեր օբյեկտներ)
System.out.println(a2.equals(a3)); // true (արժեքների համեմատություն)

Այսպիսով, == համեմատում է օբյեկտների հղումները, իսկ արժեքների համեմատության համար՝ equals()-ը։ Integer-ի կեշը [-128, 127] տիրույթում ազդում է ==-ի արդյունքի վրա, երբ աշխատում ենք այդ տիրույթում գտնվող թվերի հետ։