Java包裝類型的比較

首先看一道題,

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方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章