亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是拳擊和拆箱以及有什么權衡取舍?

什么是拳擊和拆箱以及有什么權衡取舍?

什么是拳擊和拆箱以及有什么權衡取舍?我正在尋找一個清晰,簡潔和準確的答案。理想情況下,作為實際答案,雖然歡迎鏈接到良好的解釋。
查看完整描述

3 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

盒裝值是圍繞基本類型 *的最小包裝器的數據結構。盒裝值通常存儲為堆上對象的指針。

因此,盒裝值使用更多內存并至少需要兩次內存查找才能訪問:一次獲取指針,另一次跟隨指向該基元的指針。顯然,這不是你想要在內循環中的那種東西。另一方面,盒裝值通常與系統中的其他類型相比更好。由于它們是該語言中的一流數據結構,因此它們具有其他數據結構所具有的預期元數據和結構。

在Java和Haskell中,泛型集合不能包含未裝箱的值。.NET中的通用集合可以保留未裝箱的值而不會受到懲罰。在Java的泛型僅用于編譯時類型檢查的情況下,.NET將為在運行時實例化的每個泛型類型生成特定的類。

Java和Haskell有未裝箱的數組,但它們明顯不如其他集合方便。但是,當需要達到峰值性能時,為避免裝箱和拆箱的開銷值得一點不便。

*對于此討論,原始值是可以存儲在調用堆棧中的任何值,而不是存儲為指向堆上的值的指針。通常,這只是機器類型(整數,浮點數等),結構,有時是靜態大小的數組。.NET-land將它們稱為值類型(與引用類型相反)。Java人稱它們為原始類型。Haskellions只是將它們稱為未裝箱。

**我也在這個答案中專注于Java,Haskell和C#,因為這就是我所知道的。對于它的價值,Python,Ruby和Javascript都只有盒裝價值。這也被稱為“一切都是對象”的方法***。

***警告:在某些情況下,足夠先進的編譯器/ JIT實際上可以檢測到在查看源時語義上裝箱的值,可以在運行時安全地成為未裝箱的值。實質上,由于出色的語言實現者,您的盒子有時是免費的。


查看完整回答
反對 回復 2019-08-12
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

裝箱和拆箱是將原始值轉換為面向對象的包裝類(裝箱),或將值從面向對象的包裝類轉換回原始值(拆箱)的過程。

例如,在java中,如果要將int值存儲為a ,則可能需要將值轉換為Integer(裝箱),Collection因為基元不能存儲在Collection僅對象中。但是當你想要把它從它中取出時Collection你可能想要得到的價值int而不是Integer那樣你就可以取消它。

拳擊和拆箱本身并不,但這是一個權衡。根據語言實現,它可能比僅使用基元更慢且占用更多內存。但是,它還可以允許您使用更高級別的數據結構,并在代碼中實現更大的靈活性。

目前,它最常見于Java(和其他語言)“autoboxing / autounboxing”功能的上下文中。這是一個以java為中心的autoboxing解釋


查看完整回答
反對 回復 2019-08-12
  • 3 回答
  • 0 關注
  • 470 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號