如果不明就裏很容易認爲兩個輸出要麼都是true要麼都是false。首先需要注意的是f1、f2、f3、f4四個變量都是Integer對象引用,所以下面的==運算比較的不是值而是引用。裝箱的本質是什麼呢?當我們給一個Integer對象賦一個int值的時候,會調用Integer類的靜態方法valueOf
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
簡單的說,如果整型字面量的值在-128到127之間,那麼不會new新的Integer對象,而是直接引用常量池中的Integer對象,所以上面的面試題中f1f2的結果是true,而f3f4的結果是false。
題目二答案:
答:首先 Integer i = 1; 做了自動裝箱(使用 valueOf() 方法將 int 裝箱爲 Integer 類型),接着 i += 1; 先將 Integer 類型的 i 自動拆箱成 int(使用 intValue() 方法將 Integer 拆箱爲 int),完成加法運行之後的 i 再裝箱成 Integer 類型。