3 回答

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

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
裝箱和拆箱是將原始值轉(zhuǎn)換為面向?qū)ο蟮陌b類(裝箱),或?qū)⒅祻拿嫦驅(qū)ο蟮陌b類轉(zhuǎn)換回原始值(拆箱)的過程。
例如,在java中,如果要將int
值存儲為a ,則可能需要將值轉(zhuǎn)換為Integer
(裝箱),Collection
因?yàn)榛荒艽鎯υ?code>Collection僅對象中。但是當(dāng)你想要把它從它中取出時(shí)Collection
你可能想要得到的價(jià)值int
而不是Integer
那樣你就可以取消它。
拳擊和拆箱本身并不壞,但這是一個(gè)權(quán)衡。根據(jù)語言實(shí)現(xiàn),它可能比僅使用基元更慢且占用更多內(nèi)存。但是,它還可以允許您使用更高級別的數(shù)據(jù)結(jié)構(gòu),并在代碼中實(shí)現(xiàn)更大的靈活性。
目前,它最常見于Java(和其他語言)“autoboxing / autounboxing”功能的上下文中。這是一個(gè)以java為中心的autoboxing解釋。
添加回答
舉報(bào)