一文探尋Java裝箱和拆箱的奧妙
前言
今天在逛某知名論壇的時(shí)候,看到一篇"請(qǐng)不要使用包裝類型,避免造成性能損失"的文章。一下子就吸引了我的注意。大意就是,能用基本數(shù)據(jù)類型就盡量用基本數(shù)據(jù)類型,因?yàn)榘b類型自動(dòng)拆箱、裝箱會(huì)帶來(lái)性能損失尤其是循環(huán)使用時(shí)會(huì)大量創(chuàng)建對(duì)象。所以今天聊一下,Java的裝箱和拆箱。
什么是裝箱和拆箱
Java中的裝箱(boxing)和拆箱(unboxing)是指將基本數(shù)據(jù)類型與其對(duì)應(yīng)的包裝類之間進(jìn)行轉(zhuǎn)換的過(guò)程。
裝箱
裝箱是將基本數(shù)據(jù)類型轉(zhuǎn)換為其對(duì)應(yīng)的包裝類,例如將int類型轉(zhuǎn)換為Integer類型。這個(gè)過(guò)程是通過(guò)自動(dòng)裝箱(autoboxing)或手動(dòng)裝箱(manual boxing)完成的。自動(dòng)裝箱是指Java編譯器自動(dòng)將基本類型轉(zhuǎn)換為包裝類型,而手動(dòng)裝箱則是通過(guò)調(diào)用包裝類的構(gòu)造函數(shù)來(lái)完成。
拆箱
拆箱是將包裝類轉(zhuǎn)換為其對(duì)應(yīng)的基本數(shù)據(jù)類型,例如將Integer類型轉(zhuǎn)換為int類型。這個(gè)過(guò)程也是通過(guò)自動(dòng)拆箱(autounboxing)或手動(dòng)拆箱(manual unboxing)完成的。自動(dòng)拆箱是指Java編譯器自動(dòng)將包裝類型轉(zhuǎn)換為基本類型,而手動(dòng)拆箱則是通過(guò)調(diào)用包裝類的xxxValue()方法來(lái)完成。
為啥要包裝類型
在日常使用的時(shí)候,感覺(jué)用基本類型還是包裝類型貌似沒(méi)啥區(qū)別。如果去掉包裝類型,那就不需要裝箱和拆箱了。也就避免了性能損失。貌似很完美呀。
如果你是這樣想就,大錯(cuò)特錯(cuò)了。java中有基本數(shù)據(jù)類型和包裝類型,這是為了滿足不同需求的設(shè)計(jì)。java大佬們肯定不會(huì)做這樣的無(wú)用功的,使用包裝類型的主要原因包括:
- 對(duì)象引用:基本類型不是對(duì)象,無(wú)法使用對(duì)象引用,而包裝類型是對(duì)象,可以通過(guò)引用來(lái)操作。
- 泛型:泛型不能使用基本數(shù)據(jù)類型,必須使用包裝類型。如,使用
List<Integer>來(lái)存儲(chǔ)一組整數(shù),而不是使用List<int>。 - null值:基本類型不能為null,而包裝類型可以為null。
- 類型轉(zhuǎn)換:包裝類型提供了許多類型轉(zhuǎn)換方法,例如將字符串轉(zhuǎn)換為整數(shù)或浮點(diǎn)數(shù)等,這些方法非常方便。
- 方法重載:方法重載可以使用不同的參數(shù)類型,但是基本數(shù)據(jù)類型和其對(duì)應(yīng)的包裝類型在方法中被認(rèn)為是不相同的類型,因此可以在方法中使用它們進(jìn)行重載。
盡管基本數(shù)據(jù)類型在Java中非常有用,但是包裝類型提供了更多的功能和靈活性,因此在某些情況下使用包裝類型會(huì)更為方便和實(shí)用。所以就有了裝箱和拆箱的過(guò)程。
裝箱和拆箱的進(jìn)化過(guò)程
在Java 1.4及之前,裝箱和拆箱需要手動(dòng)進(jìn)行,即需要使用對(duì)應(yīng)的構(gòu)造函數(shù)或方法來(lái)完成。例如,要將int類型的變量x裝箱成Integer類型,可以使用以下代碼:
int x = 10; Integer y = new Integer(x); // 手動(dòng)裝箱
要將Integer類型的變量y拆箱成int類型,可以使用以下代碼:
Integer y = new Integer(10); int x = y.intValue(); // 手動(dòng)拆箱
這種方式比較繁瑣,也容易出錯(cuò)。因此,從Java 5開始,引入了自動(dòng)裝箱和拆箱機(jī)制。這意味著我們可以直接將基本數(shù)據(jù)類型賦值給對(duì)應(yīng)的封裝類型變量,或?qū)⒎庋b類型變量賦值給對(duì)應(yīng)的基本數(shù)據(jù)類型變量,編譯器會(huì)自動(dòng)完成轉(zhuǎn)換。例如:
int x = 10; Integer y = x; // 自動(dòng)裝箱 int z = y; // 自動(dòng)拆箱
從Java 9開始,引入了一種新的裝箱方式,稱為“緊湊型裝箱”(Compact Number Box),它能夠更高效地存儲(chǔ)小范圍內(nèi)的數(shù)值。緊湊型裝箱只適用于byte、short和int類型的封裝類型,這些類型的取值范圍都比較?。ㄈ鏱yte的取值范圍為-128到127),因此可以使用一個(gè)byte或short類型的變量來(lái)存儲(chǔ)它們的值,而無(wú)需使用一個(gè)整型變量。
到底該如何選擇呢
基本類型是Java語(yǔ)言的基礎(chǔ),可以直接存儲(chǔ)在棧中,具有較高的執(zhí)行效率和較小的內(nèi)存占用。包裝類型是把基本類型封裝起來(lái)的對(duì)象,可以在堆中存儲(chǔ),可以進(jìn)行各種面向?qū)ο蟮牟僮?。所以在選擇使用基本類型還是包裝類型時(shí),可以考慮以下幾個(gè)因素:
- 執(zhí)行效率:基本類型具有較高的執(zhí)行效率,尤其是在大量計(jì)算的情況下,使用基本類型可以明顯提高程序的執(zhí)行速度。
- 內(nèi)存占用:基本類型在棧中存儲(chǔ),占用的內(nèi)存較小,而包裝類型在堆中存儲(chǔ),占用的內(nèi)存較大。
- 對(duì)象操作:如果需要進(jìn)行面向?qū)ο蟮牟僮?,例如通過(guò)equals()方法比較兩個(gè)變量的值,或者將基本類型轉(zhuǎn)換為字符串,就需要使用包裝類型。
- 空值處理:基本類型不能表示空值,而包裝類型可以用null表示空值,因此在需要處理空值的情況下,需要使用包裝類型。
總結(jié)
Java中的裝箱和拆箱技術(shù)經(jīng)歷了從手動(dòng)到自動(dòng)、從普通到緊湊型的演進(jìn),這使得我們能夠更方便地操作基本數(shù)據(jù)類型和封裝類型之間的轉(zhuǎn)換。雖然更加方便, 但是在實(shí)際開發(fā)中,還是需要根據(jù)具體的使用場(chǎng)景進(jìn)行選擇。
到此這篇關(guān)于一文探尋Java裝箱和拆箱的奧妙的文章就介紹到這了,更多相關(guān)Java裝箱 拆箱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java數(shù)據(jù)存儲(chǔ)的“雙子星”對(duì)決(Map和Set的區(qū)別)
文章主要介紹了Java中Map和Set兩種數(shù)據(jù)結(jié)構(gòu)的定義、實(shí)現(xiàn)、方法及應(yīng)用場(chǎng)景,Map用于存儲(chǔ)鍵值對(duì),鍵唯一,值可重復(fù);Set用于存儲(chǔ)唯一元素,無(wú)序,兩者都提供了豐富的操作方法,如添加、刪除、查找等,感興趣的朋友一起看看吧2025-02-02
淺談常用Java數(shù)據(jù)庫(kù)連接池(小結(jié))
這篇文章主要介紹了淺談常用Java數(shù)據(jù)庫(kù)連接池(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
SpringMVC使用MultipartFile 實(shí)現(xiàn)異步上傳方法介紹
這篇文章主要介紹了SpringMVC使用MultipartFile 實(shí)現(xiàn)異步上傳方法介紹,涉及pom依賴的添加,配置文件的修改等具體操作代碼,需要的朋友可以了解下。2017-09-09
Java 實(shí)戰(zhàn)項(xiàng)目錘煉之在線美食網(wǎng)站系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)在線美食網(wǎng)站系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的方法
這篇文章主要給大家介紹了關(guān)于Spring Boot+Mybatis+Druid+PageHelper實(shí)現(xiàn)多數(shù)據(jù)源并分頁(yè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們來(lái)一起看看吧2018-05-05
使用Mybatis-plus清空表數(shù)據(jù)的操作方法
MyBatis 是一個(gè)基于 java 的持久層框架,它內(nèi)部封裝了 jdbc,極大提高了我們的開發(fā)效率,文中給大家介紹了MybatisPlus常用API-增刪改查功能,感興趣的朋友跟隨小編一起看看吧2022-11-11
IDEA找不到database圖標(biāo)的簡(jiǎn)單圖文解決方法
idea是一個(gè)功能十分強(qiáng)大的IDE,大家在使用他進(jìn)行開發(fā)時(shí)候,必不可少的就是連接數(shù)據(jù)庫(kù)了,這篇文章主要給大家介紹了關(guān)于IDEA找不到database圖標(biāo)的解決方法,需要的朋友可以參考下2024-07-07

