代碼
Integer i01 = 2;
int i02 = 59;
Integer i03 = Integer.valueOf(59);
Integer i04 = new Integer(59);
System.out.println(i01 == i02); // false
System.out.println(i01 == i03); // false
System.out.println(i03 == i04); // false
System.out.println(i02 == i04); // true
解析
i01 = 2:自動裝箱 Integer.valueOf(2),命中快取(-128~127),但值為 2。
i02 = 59:基本型別 int。
i03 = Integer.valueOf(59):快取範圍內,回傳快取物件。
i04 = new Integer(59):新建物件,不走快取。
比較結果
i01 == i02:Integer 拆箱成 int 比較值 → 2 == 59 → false。
i01 == i03:兩個 Integer 物件比較參考 → 不同物件 → false(若都是快取且值相同則 true)。
i03 == i04:快取物件 vs 新物件 → false。
i02 == i04:int vs Integer → 拆箱比較值 → 59 == 59 → true。
核心規則
== 比較基本型別看值,比較物件看參考。
Integer.valueOf() 會快取 -128~127,超出範圍新建物件。
new Integer() 永遠新建物件(Java 9+ 已棄用,建議用 valueOf)。
- 物件間比較值請用
.equals()。