首先看一道題,
Double d1 = 100.0;
Double d2 = 100.0;
Double d3 = 200.0;
Double d4 = 200.0;
System.out.println(d1==d2);
System.out.println(d3==d4);
問輸出的內容是什麼?
我開始覺得都是true
可惜答案,都是false
錯的一塌糊塗
在Java1.5以後,就有了自動拆裝箱的語法。
裝箱時自動調用XXX.valueOf();
拆箱時調用XXXValue方法。
對於8種基本類型而言,除浮點型Double、Float,其餘類型都有各自的緩存池,如下:
包裝類型 | 緩存賦值範圍 |
---|---|
Boolean | 全部緩存 |
Byte | [-128,127] |
Character | <=127 |
Short | [-128,127] |
Integer | [-128,127] |
Long | [-128,127] |
對於上述這6種類型而言,賦值操作將會從緩存池取,如果緩存池中已經有,那麼賦值操作使用的就是同一對象,如果超出緩存範圍,那麼結果就不可能爲true。
而恰好浮點類型都是沒有緩存的,所以d1、d2,d3、d4視爲不同的對象,所以答案爲false/false。
在阿里的Java規範中,明確過包裝類型之間的比較應該使用equals方法。