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

Java中的自動拆裝箱、基本類型的轉(zhuǎn)換、包裝類的緩存詳解

 更新時間:2024年12月16日 08:41:30   作者:騎個小蝸牛  
文章詳細(xì)介紹了Java中數(shù)據(jù)類型的拆裝箱、自動拆箱和裝箱,以及包裝類的緩存機制,包括基本數(shù)據(jù)類型的容量大小、轉(zhuǎn)換規(guī)則和自動類型轉(zhuǎn)換等

數(shù)據(jù)類型的拆裝箱

1. 拆箱、裝箱

拆箱

把包裝類轉(zhuǎn)換為基本數(shù)據(jù)類型就是拆箱。拆箱通過包裝類的xxValue方法實現(xiàn)。

裝箱

把基本類型轉(zhuǎn)換為包裝類的過程就是裝箱。裝箱通過包裝類的valueOf方法實現(xiàn)。

2. 自動拆箱

將包裝類自動轉(zhuǎn)化成對應(yīng)的基本數(shù)據(jù)類型(通過包裝類的xxValue方法)。

    public static void main(String[] args) {
        int int1 = new Integer(100);
        long long1 = new Long(100);
        double double1 = new Double(100.0);
    }

實際等于

    public static void main(String[] args) {
        int int1 = new Integer(100).intValue();
        long long1 = new Long(100).longValue();
        double double1 = new Double(100.0).doubleValue();
    }

3. 自動裝箱

將基本數(shù)據(jù)類型自動轉(zhuǎn)化為對應(yīng)的包裝類(通過包裝類的valueOf方法)。

    public static void main(String[] args) {
        Integer int2 = 100;
        Long long2 = 100L;
        Double double2 = 100.0;
    }

實際等于

    public static void main(String[] args) {
        Integer int2 = Integer.valueOf(100);
        Long long2 = Long.valueOf(100L);
        Double double2 = Double.valueOf(100.0);
    }

4. 自動拆裝箱使用場景

將基本類型放入集合類(自動裝箱)

集合類只支持包裝類型(不支持基本數(shù)據(jù)類型),但是我們add(基本數(shù)據(jù)類型)也不會報錯,是因為Java給我們做了自動裝箱。

實際等于

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(Integer.valueOf(1));
        list.add(Integer.valueOf(2));
    }

包裝類型和基本類型比較大小(自動拆箱)

包裝類與基本數(shù)據(jù)類型進行比較運算,其實是先將包裝類進行拆箱成基本數(shù)據(jù)類型,然后比較。

    public static void main(String[] args) {
        boolean b = new Integer(2) > 1;
    }

實際等于

    public static void main(String[] args) {
        boolean b = new Integer(2).intValue() > 1;
    }

包裝類型的運算(自動拆箱)

運算中包含包裝類型時,會將包裝類型自動拆箱為基本類型再進行運算

    public static void main(String[] args) {
        int a = new Integer(1) + 1;
    }

實際等于

    public static void main(String[] args) {
        int a = new Integer(1).intValue() + 1;
    }

三目運算(自動拆箱)

value = flag ? value1 : value2

三目運算中,如果value1和value2中一個是基本數(shù)據(jù)類型、另一個是包裝類型。那么無論value是基本數(shù)據(jù)類型還是包裝類型,只要根據(jù)判斷結(jié)果從value1和value2選擇的那個值是包裝類型時,都會先把包裝類型拆箱為基本數(shù)據(jù)類型,再根據(jù)value的類型來決定是否再對值進行拆封箱處理。

    public static void main(String[] args) {
        Integer a = null;
        int v1 = true ? 0 : a;// 正常
        int v2 = false ? 0 : a;// 報錯
        Integer v3 = true ? 0 : a;// 正常
        Integer v4 = false ? 0 : a;// 報錯
    }

實際等于

    public static void main(String[] args) {
        Integer a = null;
        int v1 = true ? 0 : a;// 正常
        int v2 = false ? 0 : a.intValue();// 報錯
        Integer v3 = true ? 0 : a;// 正常
        Integer v4 = false ? 0 : Integer.valueOf(a.intValue());// 報錯
    }

方法的返回值(自動拆裝箱)

方法的返回值類型與實際返回值類型不同時,會自動拆裝箱,變成方法返回值相同的類型。

    //自動拆箱
    public int getNum1() {
        return new Integer(1);
    }

    //自動裝箱
    public Integer getNum2() {
        return 1;
    }

實際等于

    //自動拆箱
    public int getNum1() {
        return new Integer(1).byteValue();
    }

    //自動裝箱
    public Integer getNum2() {
        return Integer.valueOf(1);
    }

5. 自動拆裝箱的觸發(fā)時機

在編譯期,Java文件編譯稱Class(字節(jié)碼)文件的過程中觸發(fā)自動拆裝箱的動作。

通過查看字節(jié)碼文件可以予以證明。兩種查看字節(jié)碼信息的方式:

1.通過javac和javap查看

先通過javac將.java代碼編譯成.class字節(jié)碼,然后通過javap分析字節(jié)碼。

javac:編譯成class(字節(jié)碼)

javac DemoTest.java

javap:分析字節(jié)碼

javap -verbose DemoTest.class

若出現(xiàn)編碼問題,可指定編碼

javac -encoding utf-8 DemoTest.java
javap -encoding utf-8 -verbose DemoTest.class

2.IDEA使用ASM Bytecode Outline插件查看字節(jié)碼

類文件上右鍵->選擇: Show Bytecode outline

面板上的三個選項:

  • Bytecode 表示對應(yīng)的class字節(jié)碼文件
  • ASMified 表示利用ASM框架生成字節(jié)碼對應(yīng)的代碼
  • Groovified 對應(yīng)的是class字節(jié)碼指令

6. 自動拆裝箱帶來的問題

  • 包裝對象之間的數(shù)值比較不能簡單的使用==,除了特殊有緩存的情況(如Integer的-128~127),其他比較都需要使用equals比較。
  • 如果包裝類對象為NULL,那么自動拆箱就可能會拋出空指針異常
  • 如果一個for循環(huán)中有大量拆裝箱操作,會浪費很多資源

基本數(shù)據(jù)類型的轉(zhuǎn)換

1. 容量大小排序

基本數(shù)據(jù)類型容量大小排序(不含布爾類型、容量由小到大):

  • byte<short/char<int<long<float<double
  • byte<<int<long<float<double

2. 轉(zhuǎn)換規(guī)則

  1. 8種基本數(shù)據(jù)類型中,除了布爾類型之外,其他的8中數(shù)據(jù)類型之間都可以相互轉(zhuǎn)換
  2. 任何浮點類型不管占用多少個字符,都比整數(shù)型容量大
  3. char和short可表示的種類數(shù)量相同,但是char可以取更大的整數(shù)
  4. 整數(shù)的默認(rèn)類型為int,小數(shù)的默認(rèn)類型為double
  5. 小容量向大容量轉(zhuǎn)換,稱為自動類型轉(zhuǎn)換(又稱隱式類型轉(zhuǎn)換),不會丟失精度
  6. 大容量轉(zhuǎn)換成小容量,叫做強制類型轉(zhuǎn)換(又稱顯式類型轉(zhuǎn)換),可能會會丟失精度,需要加強制類型轉(zhuǎn)換符。
  7. 當(dāng)整數(shù)字面值沒有超出byte,short,char的取值范圍,可以直接賦值給byte,short,char類型的變量
  8. 多種數(shù)據(jù)類型混合運算,先轉(zhuǎn)換成容量大的那種類型再做運算(byte,short,char混合運算的時候,各自先轉(zhuǎn)換成int類型再做運算)

3. 自動類型轉(zhuǎn)換

小容量向大容量轉(zhuǎn)換,稱為自動類型轉(zhuǎn)換(又稱隱式類型轉(zhuǎn)換)。

規(guī)則

  • 小容量的類型轉(zhuǎn)化為大容量的類型自動使用自動類型轉(zhuǎn)換
  • 整數(shù)類型可以自動轉(zhuǎn)化為浮點類型,可能會產(chǎn)生舍入誤差
  • 字符可以自動提升為整數(shù)

4. 強制類型轉(zhuǎn)換

大容量轉(zhuǎn)換成小容量,叫做強制類型轉(zhuǎn)換(又稱顯式類型轉(zhuǎn)換)。

強制類型轉(zhuǎn)換需要在要強制類型轉(zhuǎn)換的前面加上括號,然后在括號里面加上你要轉(zhuǎn)換的類型。

規(guī)則

  • 大容量的類型轉(zhuǎn)化為大容量的類型必須使用強制類型轉(zhuǎn)換
  • 強制類型轉(zhuǎn)換可能導(dǎo)致溢出或損失精度
  • 浮點數(shù)到整數(shù)的轉(zhuǎn)換是通過舍棄小數(shù)得到,而不是四舍五入
  • 不能把對象類型轉(zhuǎn)換為不相干的類型

包裝類的緩存

Java包裝類的緩存機制,是在Java 5中引入的一個有助于節(jié)省內(nèi)存、提高性能的功能。

包裝類的緩存只在裝箱(通過包裝類的valueOf方法來實現(xiàn))時有效。

想必大家一定遇到過這樣的問題:兩個數(shù)值相等的包裝類型對象通過==進行比較時,得到的結(jié)果有時是true,有時又是false。

這可能就是包裝類的緩存在搗亂:當(dāng)包裝類對象經(jīng)歷過裝箱操作,得到的對象可能是緩存好的對象,也可能是新創(chuàng)建的對象。

1. 包裝類型的緩存值范圍

基本類型大小(bit)默認(rèn)值取值范圍包裝類包裝類緩存范圍
byte(字節(jié))80[-2^7,2^7-1]
[-128,127]
Byte[-128,127]
char(字符)16空值(\u0000)
(unicode編碼)
[0,2^16-1]
[0,65535]
Character[0,127]
short(短整數(shù))160[-2^15,2^15-1]
[-32768,32767]
Short[-128,127]
int(整數(shù))320[-2^31,2^31-1]
[-2147483648,2147483647]
Integer[-128,127]
long(長整數(shù))640L[-2^63,2^63-1]
[-9223372036854774808,9223372036854774807]
Long[-128,127]
float(單精度小數(shù))320.0F[-2^31,2^31-1]
[3.402823e+38,1.401298e-45]
Float
double(雙精度小數(shù))640.0[-2^63,2^63-1]
[1.797693e+308,4.9000000e-324]
Double
boolean(布爾值)8falsetrue,falseBooleantrue,false

boolean類型的底層是轉(zhuǎn)換為1,0存儲的,所以大小只有一個字節(jié)(8位)

  • valueOf方法的邏輯是先從判斷值是否在緩存值范圍中。如果在,直接返回緩存中的對象;如果不在,創(chuàng)建新的對象。
  • 在 jdk 1.8 所有的數(shù)值類緩沖池中,Integer 的緩沖池 IntegerCache 很特殊,這個緩沖池的下界是 - 128,上界默認(rèn)是 127,但是這個上界是可調(diào)的。
  • 在啟動 jvm 的時候,通過 -XX:AutoBoxCacheMax=來指定這個緩沖池的大小,該選項在 JVM 初始化的時候會設(shè)定一個名為 java.lang.IntegerCache.high 系統(tǒng)屬性,然后IntegerCache 初始化的時候就會讀取該系統(tǒng)屬性來決定上界。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8新特性之重復(fù)注解與類型注解詳解

    Java8新特性之重復(fù)注解與類型注解詳解

    這篇文章主要使介紹了Java8新特性重復(fù)注解與類型注解,文章還介紹了JDK5中的注解與之對比,感興趣的朋友可以參考下面具體文章內(nèi)容
    2021-09-09
  • 我們來說說Java LockSupport 的 park 和 unpark

    我們來說說Java LockSupport 的 park 和 unpa

    LockSupport是JDK底層線程阻塞工具,通過park/unpark實現(xiàn)線程阻塞與喚醒,避免死鎖,與Object的wait/notify相比,無需監(jiān)視器,支持先unpark后park,且更精確控制線程狀態(tài),是AQS等同步器的核心基礎(chǔ),本文介紹Java LockSupport 的 park 和 unpark,感興趣的朋友一起看看吧
    2025-07-07
  • IDEA啟動tomcat狀態(tài)404的解決

    IDEA啟動tomcat狀態(tài)404的解決

    在使用Idea進行Java?Web開發(fā)過程中,經(jīng)常會遇到Tomcat出現(xiàn)404錯誤的問題,本文就來介紹了IDEA啟動tomcat狀態(tài)404的解決,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Spring容器注冊組件實現(xiàn)過程解析

    Spring容器注冊組件實現(xiàn)過程解析

    這篇文章主要介紹了Spring容器注冊組件實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java實現(xiàn)獲取行政區(qū)劃的示例代碼

    Java實現(xiàn)獲取行政區(qū)劃的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實現(xiàn)獲取行政區(qū)劃的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)游戲
    2023-03-03
  • 有關(guān)于整體刷新和局部刷新frameset窗口

    有關(guān)于整體刷新和局部刷新frameset窗口

    本篇小編為大家介紹有關(guān)于整體刷新和局部刷新frameset窗口的方法,希望對有需要的朋友有所幫助。
    2013-04-04
  • Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    這篇文章主要介紹了Java的線程阻塞、中斷及優(yōu)雅退出方法詳解,Java中的線程阻塞是指當(dāng)一個線程無法繼續(xù)執(zhí)行時,它會進入阻塞狀態(tài),直到某個條件滿足后才能繼續(xù)執(zhí)行,線程阻塞可以通過多種方式實現(xiàn),需要的朋友可以參考下
    2023-10-10
  • maven實現(xiàn)docker自動化部署插件的使用

    maven實現(xiàn)docker自動化部署插件的使用

    本文主要介紹了maven實現(xiàn)docker自動化部署插件的使用,分享給大家,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Java中SimpleDateFormat方法超詳細(xì)分析

    Java中SimpleDateFormat方法超詳細(xì)分析

    這篇文章主要給大家介紹了關(guān)于Java中SimpleDateFormat方法超詳細(xì)分析的相關(guān)資料,SimpleDateFormat 是一個以國別敏感的方式格式化和分析數(shù)據(jù)的具體類,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • SpringMVC中的Model對象用法說明

    SpringMVC中的Model對象用法說明

    這篇文章主要介紹了SpringMVC中的Model對象用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

北票市| 辉县市| 从江县| 博客| 余干县| 禹州市| 库车县| 衡山县| 翁牛特旗| 中江县| 西城区| 项城市| 吕梁市| 宣武区| 伊吾县| 华蓥市| 永靖县| 饶河县| 逊克县| 自治县| 海南省| 民乐县| 同心县| 彩票| 太保市| 彩票| 晋中市| 社会| 嫩江县| 夏河县| 荔浦县| 荣成市| 长乐市| 凤冈县| 常宁市| 新干县| 兴文县| 辰溪县| 五莲县| 新乡县| 石首市|