欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

什么是拆箱和裝箱?

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

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

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

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)拆箱和裝箱?

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

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

裝箱

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

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對象
  • astore_1 將裝箱后的Integer對象存儲到局部變量表的索引1 處(即變量 a)

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

拆箱

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

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

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

Integer.valueof()

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

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

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

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

總結(jié)

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

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

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

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

相關(guān)文章

  • Java實(shí)現(xiàn)輕松處理日期和時間的API小結(jié)

    Java實(shí)現(xiàn)輕松處理日期和時間的API小結(jié)

    這篇文章主要為大家詳細(xì)介紹了Java中的日期和時間API,可以輕松處理日期和時間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Kafka 安裝與配置詳細(xì)過程

    Kafka 安裝與配置詳細(xì)過程

    本節(jié)詳細(xì)介紹 Kafka 運(yùn)行環(huán)境的搭建,為了節(jié)省篇幅,本節(jié)的內(nèi)容以 Linux CentOS 作為安裝演示的操作系統(tǒng),其他 Linux 系列的操作系統(tǒng)也可以參考本節(jié)的內(nèi)容,對Kafka 安裝與配置相關(guān)知識感興趣的朋友一起看看吧
    2021-11-11
  • 用java WebSocket做一個聊天室

    用java WebSocket做一個聊天室

    這篇文章主要為大家詳細(xì)介紹了用java WebSocket做一個聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java 并發(fā)編程中的鎖機(jī)制示例詳解

    Java 并發(fā)編程中的鎖機(jī)制示例詳解

    本文探討了Java并發(fā)編程中的鎖機(jī)制,包括鎖的基本概念、Java中的鎖類型如synchronized、ReentrantLock、ReadWriteLock、鎖的優(yōu)化策略以及如何避免死鎖,文章強(qiáng)調(diào)了合理選擇和優(yōu)化鎖使用對于提升程序并發(fā)性能的重要性,并提供了實(shí)際應(yīng)用中的最佳實(shí)踐,感興趣的朋友一起看看吧
    2025-01-01
  • 一文詳解SpringBoot3如何自定義starter

    一文詳解SpringBoot3如何自定義starter

    在Spring Boot中,starter是一種特殊的依賴,它可以幫助開發(fā)人員快速引入和配置某個特定的功能模塊,我們在面試中通過會被問到SpringBoot3如何自定義starter,所以本文小編給大家詳細(xì)介紹了SpringBoot3自定義starter的步驟,需要的朋友可以參考下
    2024-09-09
  • Spring項(xiàng)目接入DeepSeek的兩種超簡單的方式分享

    Spring項(xiàng)目接入DeepSeek的兩種超簡單的方式分享

    DeepSeek?作為一款卓越的國產(chǎn)?AI?模型,越來越多的公司考慮在自己的應(yīng)用中集成,本文為大家?分享了Spring項(xiàng)目接入DeepSeek的兩種超簡單的方式,希望對大家有所幫助
    2025-02-02
  • 解決@Value注解不能注入static修飾的屬性問題

    解決@Value注解不能注入static修飾的屬性問題

    這篇文章主要介紹了解決@Value注解不能注入static修飾的屬性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java根據(jù)表達(dá)式獲取對象中的值及設(shè)置值的例子

    Java根據(jù)表達(dá)式獲取對象中的值及設(shè)置值的例子

    這篇文章主要介紹了Java根據(jù)表達(dá)式獲取對象中的值及設(shè)置值的例子,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-03-03
  • java創(chuàng)建以任意圖片為背景的窗口

    java創(chuàng)建以任意圖片為背景的窗口

    這篇文章主要為大家詳細(xì)介紹了java創(chuàng)建以任意圖片為背景的窗口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 一文徹底搞懂Java和JDK的版本命名問題

    一文徹底搞懂Java和JDK的版本命名問題

    今天通過本文給大家分享我對Java的版本號以及JDK的命名的了解,通過實(shí)例圖文展示給大家介紹的非常詳細(xì),需要的朋友跟隨小編一起看看吧
    2021-06-06

最新評論