我們都知道,在Java中的==比較的是"物件"的參照是否相等,並不會自動使用物件本身的值做比較。
但當Integer這個類別被使用到時,其-127~128的值會先被Integer類別給cache住,也因此若在Integer類別上使用==時,不同的參照方式在不同範圍內的值會有不同的結果。
直接assign,或是使用Integer.valueOf(int)的時候,在-127~128內的值會參照到同樣的物件,也就是==會比較到相同的物件。
使用new Integer(int)的方式時,因為各別產生新的物件,因此比較的會是不同物件。
其他wrapper classes(Byte, Short, Long, Character)也有相同的cache機制,cache的範圍各不相同,Float則沒有此機制。
另外BigDecimal也有此機制,範圍為0~10。
參考來源:
Immutable Objects / Wrapper Class Caching