Sobes.tech
Middle

Java-da Integer a = 127 və int b = 127, eləcə də Integer a1 = 128 və int b1 = 128 müqayisə edildikdə nə baş verir? Niyə müqayisə nəticələrinin fərqli olacağını izah edin.

sobes.tech Süni İntellekt

AI-dan cavab

Integer a = 127int b = 127 müqayisə edildikdə, == operatoru istifadə olunaraq nəticə true olacaq. Bu, int b-nin Integer obyektinə avtomatik paketlənməsi (autoboxing) və 127 dəyərinin önbelleğe alınmış Integer obyektləri diapazonunda (standart olaraq -128-dən 127-yə qədər) olması ilə əlaqədardır. Java bu dəyərlər üçün obyekt hovuzundan istifadə edir, buna görə a və paketlənmiş b eyni obyektə istinad edir.

Integer a1 = 128int b1 = 128 müqayisə edildikdə, == operatorunun nəticəsi false olacaq. Hətta b1 də avtomatik olaraq Integer obyektinə paketlənir, lakin 128 dəyəri önbelleğe alınmış diapazon xaricindədir. Buna görə, autoboxing zamanı yeni Integer obyekti yaradılır. a1 və paketlənmiş b1 fərqli obyektlərə istinad edir, hətta onların sayısal dəyərləri eynidir.

Wrapper obyektlərinin (məsələn, Integer) dəyərlərini müqayisə etmək üçün equals() metodundan istifadə edilməlidir.

// Dəyərlərin müqayisəsi
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing və `Integer` önbelleklemesi)
System.out.println(a.equals(b)); // true (dəyərlərin müqayisəsi)

Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing, amma bu dəyər üçün önbellek yoxdur)
System.out.println(a1.equals(b1)); // true (dəyərlərin müqayisəsi)

Integer a2 = new Integer(127); // Yeni obyekt yaradılır, dəyər önbellekte olsa belə
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (fərqli obyektlər)
System.out.println(a2.equals(a3)); // true (dəyərlərin müqayisəsi)

Beləliklə, == wrapper tiplər üçün obyekt referanslarını müqayisə edir, equals() isə primitiv tiplər və ya wrapper obyektlərinin dəyərlərini müqayisə etmək üçün istifadə olunmalıdır. Integer-in [-128, 127] diapazonunda önbelleğe alınması, bu diapazondakı saylarla işləyərkən == nəticəsinə təsir edir.