+2 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

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

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

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

1 پاسخ

+3 امتیاز
قبل توسط (302 امتیاز)
ویرایش شده قبل توسط
 
بهترین پاسخ

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

 

سوالات مشابه

0 امتیاز
1 پاسخ 586 بازدید
+2 امتیاز
2 پاسخ 5.7هزار بازدید
0 امتیاز
1 پاسخ 957 بازدید
0 امتیاز
1 پاسخ 2.1هزار بازدید
0 امتیاز
1 پاسخ 306 بازدید
0 امتیاز
2 پاسخ 1.0هزار بازدید
0 امتیاز
2 پاسخ 434 بازدید
+1 امتیاز
1 پاسخ 667 بازدید
+2 امتیاز
1 پاسخ 450 بازدید
0 امتیاز
0 پاسخ 260 بازدید
...