چرا در جاوا دو عدد 128 از نوع Integer با یکدیگر برابر نیستند؟

+2 رأی
میانگین بازدید روزانه 0.21530 بازدید

چرا تکه کد زیر خروجی false رو چاپ می کنه:

public class MainClass 
{
    public static void main(String[] args) 
    {
        Integer i1 = 128;
         
        Integer i2 = 128;
         
        System.out.println(i1 == i2);
    }
}

ولی وقتی عدد از 128 به 127 تغییر می کنه، خروجی true میشه؟

سوال 6 سال قبل در تالار برنامه نویسی توسط Saeed Zarinfam (959 امتیاز)

1 جواب

+3 رأی
 
بهترین جواب

1. این که از عدد 128 به بالا false برمیگردونه ایرادی نیست،

2. اینکه چرا اعداد بین 128- تا 127 true برمیگردونه باید بررسی بشه.

1 => برای قسمت اول باید false برگرده چون object های ساخته شده از Integer در جاهای مختلف حافظه هیپ ذخیره میشه و رفرنس ها به جاهای مختلفی اشاره می کنند. (وقتی برای مقایسه دو Integer از == استفاده میکنیم بر خلاف equals فقط یکی بودن آدرس اشیا ذخیره شده در رفرنس ها چک میشه.) پس مشکلی نیست که false رو در خروجی ببینیم.

2 => در کلاس Integer وقتی دو عدد در محدوده ی 128- تا 127 قرار داشته باشند برای اونها object ساخته نمیشه بلکه اوهارو درون یک کَش قرار میدن تا همیشه reference های این اعداد به یک جا اشاره کنند برای همینه که وقتی از == استفاده میکنیم برای اعداد درون این محدوده در خروجی true می بینیم.

public static Integer valueOf(int i) {

     final int offset = 128;
     if (i >= -128 && i <= 127) { // must cache
         return IntegerCache.cache[i + offset];
     }
     return new Integer(i);
}

 

جواب 6 سال قبل توسط ehsolimo (302 امتیاز)
ویرایش 6 سال قبل توسط ehsolimo

سوال های مشابه

0 رأی
1 جواب میانگین بازدید روزانه 0.17459 بازدید
+2 رأی
2 جواب میانگین بازدید روزانه 1.535,021 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.31687 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.751,887 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.07172 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.29792 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.09284 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.15365 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.09296 بازدید
0 رأی
0 جواب میانگین بازدید روزانه 0.2855 بازدید
کانال تلگرام جواب یاب
...