題記:前幾天面試Java基礎給來了個面試題Integer a=100,b=100;System.out.println(a==b); 當時回答是true,后來面試官又來了一個Integer a=200,b=200;System.out.println(a==b); 這個回答的也是true當時面試官笑笑說恭喜你回答錯誤,當時一愣回來才想起int的范圍。
補充: Java如何查看對象的內存地址?Java是使用hashcode來表示對象的內存地址,兩個相同的對象的hashcode是相同的,
我們可以使用System.identityHashCode(傳輸進去的參數是一個對象)打印對象的hashcode值。
我們都知道基本類型通過==比較的是他們的值大小,而引用類型比較的是他們的引用地址
這里肯定你也會和我有一樣的疑問為什么200的時候是false,100的時候是true,應該Integer包裝對象都是比較的應該是內存的地址都應該是false才對啊!
這里請看源碼:
當我們給一個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);
}
由源碼我們可以看到Integer的范圍是“-128~127”,當i在這個范圍內是從IntegerCache中直接獲取,當超越這個范圍才會new 一個新的Integer對象
這里有一點需要解釋:
一個Integer 與 int比較,先將Integer轉換成int類型,再做值比較,所以返回的是true。
java中還有與Integer類似的是Long,它也有一個緩存,在區間[-128,127]范圍內獲取緩存的值,而Long與long比較的時候先轉換成long類型再做值的比較
Double類型,它沒有緩存,但是當Double與double比較的時候會先轉換成double類型,再做值的比較。