Šta će se desiti pri poređenju Integer a = 127 i int b = 127, kao i Integer a1 = 128 i int b1 = 128 u Javi? Objasnite zašto će rezultati poređenja biti različiti.
sobes.tech АИ
Одговор од АИ
Када упоредимо Integer a = 127 и int b = 127 коришћењем оператора ==, резултат ће бити true. Ово се дешава због аутобоксинга (autoboxing) int b у објекат Integer, као и зато што вредност 127 припада опсегу кешираних објеката Integer (по подразумевану вредност од -128 до 127). Јава користи пул објеката за ове вредности, па 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 (аутобоксинг и кеширање `Integer`)
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] утиче на резултат == када радимо са бројевима у овом опсегу.