Javaда Integer a = 127 жана int b = 127 жана Integer a1 = 128 жана int b1 = 128 салыштырганда эмне болот? Неге салыштырмалуулардын жыйынтыктары айырмаланарын түшүндүрүңүз.
sobes.tech AI
AIден жооп
Integer a = 127 жана int b = 127 салыштырып жатканда, == оператору менен, натыйжа true болот. Бул автоопактоо (autoboxing) аркылуу int b объектке Integerге айландырылышы жана 127 саны кэшделген Integer объекттеринин диапазонунда (өзгөчө -128ден 127ге чейин) жатканы менен байланыштуу. Java бул маанилер үчүн объекттер пулун колдонуп, ошондуктан a жана опакталган b бирдей объектке шилтеме кылышат.
Эгер Integer a1 = 128 жана int b1 = 128 салыштырып көрсөк, == операторунун натыйжасы false болот. Себеби b1 дагы автоматтык түрдө Integer объектке опакталат, бирок 128 мааниси кэшделген маанилердин диапазонунда эмес. Ошондуктан, автоопактоо учурунда жаңы Integer объекти түзүлөт. a1 жана опакталган b1 кучада (heap) эки башка объектке шилтеме кылышат, алардын сандык маанилери бирдей болсо да.
Объект-обертка маанилерин салыштырганда (мисалы, Integer), equals() методу колдонулушу керек.
// Маанилерди салыштыруу
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (автоопактоо жана кэшделүү)
System.out.println(a.equals(b)); // true (маанилерди салыштыруу)
Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (автоопактоо, бирок кэш жок)
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]) болсо, == натыйжасы маанилердин салыштырмасында өзгөрүшү мүмкүн.