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