最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)拆箱和裝箱的原理解析

 更新時(shí)間:2024年05月22日 08:49:30   作者:猿java  
Java 是一種強(qiáng)類型語(yǔ)言,然而在 Java中Integer類型和 int類型兩種不同類型的數(shù)字卻能正常地進(jìn)行數(shù)學(xué)運(yùn)算,為什么?今天我們就來(lái)聊聊其背后的秘密:拆箱和裝箱,感興趣的小伙伴跟著小編一起來(lái)看看吧

什么是拆箱和裝箱?

拆箱和裝箱,其實(shí)是Java 5引入的一個(gè)語(yǔ)法糖,是將 Java的8種基本數(shù)據(jù)類型與其對(duì)應(yīng)的包裝類之間自動(dòng)轉(zhuǎn)換的過(guò)程,如下圖:

  • 裝箱,將基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)應(yīng)的包裝類對(duì)象的過(guò)程
  • 拆箱,將包裝類對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型的過(guò)程

如下代碼:Integer a 加上 int b 能正確的得出結(jié)果3,其中就包含裝箱和拆箱的過(guò)程。

public class UnboxingAndPackingTest {     
    public static void main(String[] args) {         
            Integer a = 1;         
            int b = 2;         
            int sum = a + b;         
            System.out.println(sum);// sum=3     
          } 
  } 

如何實(shí)現(xiàn)拆箱和裝箱?

在上述代碼中,我們并沒(méi)有手動(dòng)去執(zhí)行裝箱和拆箱,說(shuō)明這個(gè)過(guò)程是編譯器自動(dòng)完成的,那么,編譯器是如何完成裝箱和拆箱的?為了更好地說(shuō)明裝箱和拆箱的原理,我們還是延用上面的示例代碼,通過(guò)字節(jié)碼層面來(lái)進(jìn)行分析。

我們通過(guò) javap -c UnboxingAndPackingTest指令,對(duì)字節(jié)碼進(jìn)行反編譯,如下截圖:

裝箱

將上述裝箱的字節(jié)碼摘出來(lái),如下:

0: iconst_1 
1: invokestatic  #2  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
4: astore_1 

字節(jié)碼的解釋如下:

  • iconst_1 將整數(shù)常量1 壓入操作數(shù)棧
  • invokestatic #2 調(diào)用Integer.valueOf(int)方法,將整數(shù)1 裝箱為Integer對(duì)象
  • astore_1 將裝箱后的Integer對(duì)象存儲(chǔ)到局部變量表的索引1 處(即變量 a)

因此,Integer a = 1在字節(jié)碼層面是調(diào)用了Integer.valueOf(int)方法,將整數(shù)1 裝箱為Integer對(duì)象。

拆箱

將上述拆箱的字節(jié)碼摘出來(lái),如下:

7: aload_1 
8: invokevirtual #3   // Method java/lang/Integer.intValue:()I 
11: iload_2 
12: iadd 13: istore_3 

字節(jié)碼的解釋如下:

  • aload_1 將局部變量表索引1 的Integer對(duì)象加載到操作數(shù)棧
  • invokevirtual #3 調(diào)用了Integer.intValue()方法,將Integer對(duì)象拆箱為原始類型int
  • iload_2 將局部變量表索引2 的int值(即變量 b)加載到操作數(shù)棧
  • iadd 將兩個(gè)int值相加
  • istore_3 將相加后的結(jié)果存儲(chǔ)到局部變量表索引3 處(即變量 sum)

通過(guò)上述字節(jié)碼的解析,我們可以清楚地看到Java編譯器是如何將裝箱和拆箱操作插入到代碼中的。具體總結(jié)成,裝箱操作通過(guò)調(diào)用Integer.valueOf(int)方法實(shí)現(xiàn),而拆箱操作通過(guò)調(diào)用Integer.intValue()方法實(shí)現(xiàn)。

Integer.valueof()

上述示例的裝箱操作是通過(guò)調(diào)用Integer.valueOf(int)方法實(shí)現(xiàn),因此,我們來(lái)看看Integer.valueof()的源碼是如何實(shí)現(xiàn)的,源碼截圖如下:

Integer.valueof()方法,首先會(huì)檢查i是否命中緩存(-128 到 127),如果i在這個(gè)范圍內(nèi),則直接返回緩存中的Integer實(shí)例,如果i不在緩存范圍內(nèi),則創(chuàng)建一個(gè)新的Integer實(shí)例。
這里特別需要注意,Integer的緩存是-128 到 127,如果對(duì)兩個(gè) Integer進(jìn)行比較,一定要特別注意==equal()的使用。

下面以一個(gè)示例來(lái)演示Integer類型的==equal()使用:

通過(guò)Integer的例子,我們可以很輕易的聯(lián)想到Long肯定也存在類似的問(wèn)題,Long.valueof()源碼如下:

總結(jié)

本文通過(guò)具體示例從字節(jié)碼的角度分析了編譯器是如何實(shí)現(xiàn)裝箱和拆箱:

  • 裝箱和拆箱是java提供的一個(gè)語(yǔ)法糖,更加簡(jiǎn)化程序員的使用
  • 裝箱,將基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)應(yīng)的包裝類對(duì)象的過(guò)程
  • 拆箱,將包裝類對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型的過(guò)程
  • 對(duì)于8種基本類型對(duì)應(yīng)的包裝類的比較,推薦使用equal()而不是==

盡管裝箱和拆箱在 Java中是一個(gè)很簡(jiǎn)單的技術(shù)點(diǎn),但是通過(guò)今天的分析,我們不光知道了底層的原理,同時(shí)還分析了Integer.valueof()的源碼,因此,對(duì)于Java 8種基本類型對(duì)應(yīng)的包裝類的比較的原理也有一個(gè)更多的理解,以及在實(shí)際開(kāi)發(fā)中該如何避坑。

以上就是Java實(shí)現(xiàn)拆箱和裝箱的原理解析的詳細(xì)內(nèi)容,更多關(guān)于Java拆箱和裝箱的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot中處理JSON日期格式方式

    SpringBoot中處理JSON日期格式方式

    SpringBoot中處理JSON日期格式主要有三種方式:使用@JsonFormat注解、配置默認(rèn)格式以及自定義Jackson的ObjectMapper,每種方式都有其適用場(chǎng)景,可以根據(jù)具體需求選擇合適的方法
    2025-02-02
  • Java設(shè)計(jì)模式之工廠方法模式詳解

    Java設(shè)計(jì)模式之工廠方法模式詳解

    工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設(shè)計(jì)模式,此模式的核心精神是封裝類中變化的部分,提取其中個(gè)性化善變的部分為獨(dú)立類,通過(guò)依賴注入以達(dá)到解耦、復(fù)用和方便后期維護(hù)拓展的目的。它的核心結(jié)構(gòu)有四個(gè)角色,分別是抽象工廠、具體工廠、抽象產(chǎn)品、具體產(chǎn)品
    2022-08-08
  • java面試常見(jiàn)問(wèn)題---ConcurrentHashMap

    java面試常見(jiàn)問(wèn)題---ConcurrentHashMap

    ConcurrentHashMap是由Segment數(shù)組結(jié)構(gòu)和HashEntry數(shù)組結(jié)構(gòu)組成。Segment的結(jié)構(gòu)和HashMap類似,是一種數(shù)組和鏈表結(jié)構(gòu),今天給大家普及java面試常見(jiàn)問(wèn)題---ConcurrentHashMap知識(shí),一起看看吧
    2021-06-06
  • java swing GUI窗口美化方式

    java swing GUI窗口美化方式

    這篇文章主要介紹了java swing GUI窗口美化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Mybatis返回插入主鍵id的方法

    Mybatis返回插入主鍵id的方法

    這篇文章主要介紹了 Mybatis返回插入主鍵id的方法,在文章底部給大家補(bǔ)充了Mybatis中insert中返回主鍵ID的方法,非常不錯(cuò),需要的朋友可以參考下
    2017-04-04
  • Java遍歷字符串和統(tǒng)計(jì)字符個(gè)數(shù)的操作方法

    Java遍歷字符串和統(tǒng)計(jì)字符個(gè)數(shù)的操作方法

    這篇文章主要介紹了Java遍歷字符串和統(tǒng)計(jì)字符個(gè)數(shù)的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Spring @ComponentScan注解掃描組件原理

    Spring @ComponentScan注解掃描組件原理

    這篇文章主要介紹了Spring @ComponentScan自動(dòng)掃描組件使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Caffeine中本地緩存的最佳實(shí)踐與性能優(yōu)化指南

    Caffeine中本地緩存的最佳實(shí)踐與性能優(yōu)化指南

    作為 Java 生態(tài)中性能優(yōu)異的本地緩存實(shí)現(xiàn),Caffeine 提供了更高的吞吐量和更低的延遲,本文將深入剖析 Caffeine 的核心原理、源碼實(shí)現(xiàn)和實(shí)際應(yīng)用,希望對(duì)大家有所幫助
    2025-09-09
  • Spring Cloud Data Flow初體驗(yàn)以Local模式運(yùn)行

    Spring Cloud Data Flow初體驗(yàn)以Local模式運(yùn)行

    這篇文章主要介紹了Spring Cloud Data Flow初體驗(yàn)以Local模式運(yùn)行,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案)

    springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案)

    雙Token方案通過(guò)訪問(wèn)令牌和刷新令牌提高用戶登錄安全性和體驗(yàn),訪問(wèn)令牌有效期短,包含用戶信息,用于請(qǐng)求校驗(yàn),本文就來(lái)介紹一下springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案),感興趣的可以了解一下
    2024-10-10

最新評(píng)論

阜新市| 富源县| 宝丰县| 武胜县| 宁武县| 南阳市| 阿拉善右旗| 武定县| 临猗县| 长春市| 论坛| 沙雅县| 根河市| 武威市| 桃园县| 卓资县| 青海省| 西吉县| 盐池县| 翁源县| 西和县| 铁力市| 金塔县| 大余县| 新巴尔虎右旗| 北辰区| 山阳县| 资阳市| 故城县| 吉隆县| 武汉市| 平顺县| 新乡市| 南丹县| 庐江县| 巴楚县| 海宁市| 西乌珠穆沁旗| 尖扎县| 苏尼特右旗| 丹棱县|