當前位置:
首頁 > 知識 > JavaSE的自動裝箱和自動拆箱

JavaSE的自動裝箱和自動拆箱

回顧一下Java基礎數據類型:

JavaSE的自動裝箱和自動拆箱


基礎類型 位元組 包裝類型
int 4位元組 Integer
byte 1位元組 Byte
short 2位元組 Short
long 8位元組 Long
float 4位元組 Float
double 8位元組 Double
char 2位元組 Character
boolean 未定 Boolean


Java屬於面向對象語言那麼為什麼會出現非對象類型數據(基礎類型),因為基礎數據類型是的虛擬機的運行速度更快而且佔用內存更少。

為什麼要有裝箱&拆箱

在JavaSE5之前我們創建愛你Integer對象:

JavaSE的自動裝箱和自動拆箱

從JavaSE5提供了自動裝箱的特性時,我們可以更簡單的創建基礎類型的對象:

JavaSE的自動裝箱和自動拆箱


從上面的代碼我們可以簡單的看出裝箱、拆箱的操作:

Integer a = 10;//我們將10【裝箱】生成Integer對象。

int b = a;//我們將Integer【拆箱】轉成int基礎類型

裝箱和拆箱是如何實現的

我們這裡先寫一個簡單的類,然後反編譯看看它的位元組碼文件

JavaSE的自動裝箱和自動拆箱

反編譯出來的位元組碼文件:

JavaSE的自動裝箱和自動拆箱

結論:


裝箱操作:

JavaSE的自動裝箱和自動拆箱


拆箱操作:

JavaSE的自動裝箱和自動拆箱

其他&擴展

我們先來看一道面試題:

JavaSE的自動裝箱和自動拆箱

內心懷揣自己的真是答案,我們看看下邊的源代碼:

先看看Integer裝箱和拆箱的函數源碼:

JavaSE的自動裝箱和自動拆箱

  • 拆箱操作:直接返回Integer內的數值

  • 裝箱操作:在i大於IntegerCache.low或者i小於IntegerCache.high時返回緩存的Integer對象,否則創建新的Integer對象。

JavaSE的自動裝箱和自動拆箱

通過源碼碼我們可以發現,Integer在數據為[-128,127]之間時。使用了IntegerCache 返回緩存中對象的引用,否則new一個新的對象。

看到上面這個答案,有些同學就會想到:除過Integer之前還有其他的基礎數據類型,那麼其他的類型是否也是專業那個的呢?答案:是也不是。原理想想大家也都明白:


  • Boolean內部有true&false兩個靜態變數,最後裝箱得到的值都是這兩個靜態變數的引用。

  • Long&Integer&Short&Byte在數值為[-128,127]之間都有Cache。

  • Double&Float則都沒有。

所以上面問題的正確答案分別是:true、false。

見識了」==」比較,現在看equals比較結果:

同樣我們也先看一道題目:

JavaSE的自動裝箱和自動拆箱

然後我們再看看源碼:

JavaSE的自動裝箱和自動拆箱

在Java中我們知道操作」==」的兩個數都是數據包裝類型對象的引用的話,那麼則是用來比較兩個引用所指向的對象是不是同一個;而如果其中有一個操作數是表達式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程)。為什麼呢,因為」==」兩邊引用數據類型必須一致,要不然無語錯誤。

所以我們得到上邊題目的答案是:true、false。

因為第一次比較實際是先對數據進行拆箱然後比較,所以得到的結果是true;第二次比較實際是先拆箱(兩個Integer對象拆箱)後裝箱(將拆箱且計算後的數據再裝箱),然後同Long對象比較,顯然不是同一類型所以得到false。


學習Java的同學注意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java團長 的精彩文章:

程序員如何選擇未來的職業路線
Java中String通過引用傳遞問題詳細解析
Java面向對象總結
深入理解Java常用類——時間日期
深入學習Java同步器AQS

TAG:Java團長 |

您可能感興趣

為什麼 iPhone 會自動連接 WiFi、自動進入勿擾模式?
自動管理電動汽車充電負載 EO Charging推eoALM
Drive.ai計劃啟動自動駕駛網約車服務
自動裝箱和拆箱
超詳細!動手搭建一個Vuepress站點及開啟PWA與自動部署
實現Jitsi SFU自動關閉/啟動視頻層
使用jenkins搭建自動化打包的apk 下載
自動化測試的理想境界:AppCrawler自動遍歷工具
C#編寫強大的SQL Server資料庫自動備份服務
Linux構建Git代碼倉庫與自動化部署
Servlet 自動刷新頁面
Terraform,自動化配置與編排必備利器
全球租車巨頭Enterprise與Voyage合作,進軍自動駕駛行業
Jenkins構建自動化任務
印度的自動人力車搭乘應用程序Jugnoo推出Printo 3D列印店
Momenta展示自動駕駛Demo車,年內在蘇州規模化部署自動駕駛車隊
奧迪宣布全新電動轎車:配備Level 4自動駕駛
vivo X21團戰自動加速,Jovi AI你是為手游開黑而生的嗎?
Python自動生產表情包
義大利設計公司Icona發布5級自動駕駛概念車,Elaphe輪轂電機廠商賦能動力系統