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

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

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

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

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

سوال 7 سال قبل در تالار برنامه نویسی توسط Saeed Zarinfam (1,044 امتیاز)

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);
}

 

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

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

0 رأی
1 جواب میانگین بازدید روزانه 0.18543 بازدید
+2 رأی
2 جواب میانگین بازدید روزانه 1.535,468 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.32798 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.732,040 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.1266 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.31934 بازدید
0 رأی
2 جواب میانگین بازدید روزانه 0.11378 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.18503 بازدید
+2 رأی
1 جواب میانگین بازدید روزانه 0.11395 بازدید
0 رأی
0 جواب میانگین بازدید روزانه 0.36175 بازدید
کانال تلگرام جواب یاب
...