3 回答

TA貢獻1797條經驗 獲得超6個贊
盒裝值是圍繞基本類型 *的最小包裝器的數據結構。盒裝值通常存儲為堆上對象的指針。
因此,盒裝值使用更多內存并至少需要兩次內存查找才能訪問:一次獲取指針,另一次跟隨指向該基元的指針。顯然,這不是你想要在內循環中的那種東西。另一方面,盒裝值通常與系統中的其他類型相比更好。由于它們是該語言中的一流數據結構,因此它們具有其他數據結構所具有的預期元數據和結構。
在Java和Haskell中,泛型集合不能包含未裝箱的值。.NET中的通用集合可以保留未裝箱的值而不會受到懲罰。在Java的泛型僅用于編譯時類型檢查的情況下,.NET將為在運行時實例化的每個泛型類型生成特定的類。
Java和Haskell有未裝箱的數組,但它們明顯不如其他集合方便。但是,當需要達到峰值性能時,為避免裝箱和拆箱的開銷值得一點不便。
*對于此討論,原始值是可以存儲在調用堆棧中的任何值,而不是存儲為指向堆上的值的指針。通常,這只是機器類型(整數,浮點數等),結構,有時是靜態大小的數組。.NET-land將它們稱為值類型(與引用類型相反)。Java人稱它們為原始類型。Haskellions只是將它們稱為未裝箱。
**我也在這個答案中專注于Java,Haskell和C#,因為這就是我所知道的。對于它的價值,Python,Ruby和Javascript都只有盒裝價值。這也被稱為“一切都是對象”的方法***。
***警告:在某些情況下,足夠先進的編譯器/ JIT實際上可以檢測到在查看源時語義上裝箱的值,可以在運行時安全地成為未裝箱的值。實質上,由于出色的語言實現者,您的盒子有時是免費的。

TA貢獻1851條經驗 獲得超3個贊
裝箱和拆箱是將原始值轉換為面向對象的包裝類(裝箱),或將值從面向對象的包裝類轉換回原始值(拆箱)的過程。
例如,在java中,如果要將int
值存儲為a ,則可能需要將值轉換為Integer
(裝箱),Collection
因為基元不能存儲在Collection
僅對象中。但是當你想要把它從它中取出時Collection
你可能想要得到的價值int
而不是Integer
那樣你就可以取消它。
拳擊和拆箱本身并不壞,但這是一個權衡。根據語言實現,它可能比僅使用基元更慢且占用更多內存。但是,它還可以允許您使用更高級別的數據結構,并在代碼中實現更大的靈活性。
目前,它最常見于Java(和其他語言)“autoboxing / autounboxing”功能的上下文中。這是一個以java為中心的autoboxing解釋。
添加回答
舉報