java基本數據類型及其所對應對象的自動裝箱,new,valueof操作研究

昨天,今天從源程序級別仔細觀察了下這些操作的邏輯,除了沒看到過的,

都看過了:)哈哈。。。

jdk從1.5開始有了自動拆箱裝箱功能,

對寫程序方便了不少,1.5開始加了不少新特性麼。

java的基本數據類型有

boolean char byte short int float long double

對應的對象爲

Boolean Character Byte Short Integer Float Long Double

爲了提高效率(不知到底能提高多少)

java在特定的數據類型對象中(Character Byte,Short,Integer,Long),

對-128-127這個範圍內的整形對象進行了緩存,

以Integer爲例:

有static 內部類

來緩存這些對象,

另外,valueOf方法中的實現是這樣的:

所以在-128-127之間進行valueof操作,

得到的都是同一個對象。

另外,Boolean對象的緩存爲

Boolean.valueOf操作的邏輯如下:

也是緩存的結果。

下面是自動裝箱,由編譯器完成。

自動裝箱的效果類似於valueOf的效果,就是對-128-127之間的自動裝箱,

得到的必然是同一個對象。

而new操作就不一樣了,

new操作對這些數據類型來說,必然是建立一個新的對象,不會與以前new操作建立的對象重複。

閒話少說,上測試代碼:

輸出結果如下:

自動對true進行裝箱操作得到的兩個Boolean是否是同一個對象
true
自動對true進行new操作得到的兩個Boolean是否是同一個對象
false
自動對true進行valueof操作得到的兩個Boolean是否是同一個對象
true
自動對28進行裝箱操作得到的兩個Character是否是同一個對象
true
自動對333進行裝箱操作得到的兩個Character是否是同一個對象
false
自動對28進行new操作得到的兩個Character是否是同一個對象
false
自動對333進行new操作得到的兩個Character是否是同一個對象
false
自動對28進行valueof操作得到的兩個Character是否是同一個對象
true
自動對333進行valueof操作得到的兩個Character是否是同一個對象
false
自動對28進行裝箱操作得到的兩個Byte是否是同一個對象
true
自動對333進行裝箱操作得到的兩個Byte是否是同一個對象
true
自動對28進行new操作得到的兩個Byte是否是同一個對象
false
自動對333進行new操作得到的兩個Byte是否是同一個對象
false
自動對28進行valueof操作得到的兩個Byte是否是同一個對象
true
自動對333進行valueof操作得到的兩個Byte是否是同一個對象
true
自動對28進行裝箱操作得到的兩個Short是否是同一個對象
true
自動對333進行裝箱操作得到的兩個Short是否是同一個對象
false
自動對28進行new操作得到的兩個Short是否是同一個對象
false
自動對333進行new操作得到的兩個Short是否是同一個對象
false
自動對28進行valueof操作得到的兩個Short是否是同一個對象
true
自動對333進行valueof操作得到的兩個Short是否是同一個對象
false
自動對28進行裝箱操作得到的兩個Integer是否是同一個對象
true
自動對333進行裝箱操作得到的兩個Integer是否是同一個對象
false
自動對28進行new操作得到的兩個Integer是否是同一個對象
false
自動對333進行new操作得到的兩個Integer是否是同一個對象
false
自動對28進行valueof操作得到的兩個Integer是否是同一個對象
true
自動對333進行valueof操作得到的兩個Integer是否是同一個對象
false
自動對28進行裝箱操作得到的兩個Float是否是同一個對象
false
自動對333進行裝箱操作得到的兩個Float是否是同一個對象
false
自動對28進行new操作得到的兩個Float是否是同一個對象
false
自動對333進行new操作得到的兩個Float是否是同一個對象
false
自動對28進行valueof操作得到的兩個Float是否是同一個對象
false
自動對333進行valueof操作得到的兩個Float是否是同一個對象
false
自動對28進行裝箱操作得到的兩個Long是否是同一個對象
true
自動對333進行裝箱操作得到的兩個Long是否是同一個對象
false
自動對28進行new操作得到的兩個Long是否是同一個對象
false
自動對333進行new操作得到的兩個Long是否是同一個對象
false
自動對28進行valueof操作得到的兩個Long是否是同一個對象
true
自動對333進行valueof操作得到的兩個Long是否是同一個對象
false
自動對28進行裝箱操作得到的兩個Double是否是同一個對象
false
自動對333進行裝箱操作得到的兩個Double是否是同一個對象
false
自動對28進行new操作得到的兩個Double是否是同一個對象
false
自動對333進行new操作得到的兩個Double是否是同一個對象
false
自動對28進行valueof操作得到的兩個Double是否是同一個對象
false
自動對333進行valueof操作得到的兩個Double是否是同一個對象
false

對結果的簡要說明:

new操作在任何時候都是同一個對象

對float double進行valueof操作都是不同的對象

byte由於強制類型轉換,其範圍本來就是-128-127故自動裝箱,valueof操作都是同一個對象

其他的對28進行自動裝箱,valueof是同一個對象

對333則不是

 

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