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

Java詳細(xì)分析講解自動(dòng)裝箱自動(dòng)拆箱與Integer緩存的使用

 更新時(shí)間:2022年04月25日 11:02:20   作者:紙照片  
裝箱就是把基本類型轉(zhuǎn)換成包裝類,拆箱就是把包裝類轉(zhuǎn)換成基本類型,下面這篇文章主要給大家介紹Java中自動(dòng)裝箱、自動(dòng)拆箱與Integer緩存,需要的朋友可以參考下

1. 前言

自動(dòng)裝箱和自動(dòng)拆箱是什么?Integer緩存是什么?它們之間有什么關(guān)系?

先來(lái)看一道題目。

Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a==b);
Integer c = 1;
Integer d = 1;
System.out.println(c==d);
Integer e = 128;
Integer f = 128;
System.out.println(e==f);

先答,后看答案。

答案是false true false,你答對(duì)了嗎?

既然一塊出現(xiàn)了,就一起串一下知識(shí)點(diǎn)

2. 包裝類

Java中基本數(shù)據(jù)類型有八種,可以分為三類:

  • 字符型:char
  • 布爾型:boolean
  • 數(shù)值型:byte short int long float double

包裝類是將八種基本數(shù)據(jù)類型包裝為了類,使它們可以使用Java的三大特性:封裝、繼承、多態(tài)。對(duì)應(yīng)關(guān)系如下:

基本數(shù)據(jù)類型對(duì)應(yīng)的包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

數(shù)值型對(duì)應(yīng)的六個(gè)包裝類都繼承于Number類。

3. 自動(dòng)裝箱與自動(dòng)拆箱

八種基本數(shù)據(jù)類型對(duì)應(yīng)八種包裝類,那么它們是怎么進(jìn)行數(shù)據(jù)轉(zhuǎn)換的?

//基本數(shù)據(jù)類型轉(zhuǎn)包裝類
//1.有參構(gòu)造
Integer a = new Integer(1);
//2.實(shí)際上,有參構(gòu)造的參數(shù)也可以是字符串,不過(guò)要使用正確的數(shù)據(jù),“123abc”不可能會(huì)轉(zhuǎn)換為Integer類型
Integer b = new Integer("123");
//3.valueOf()
Integer c = Integer.valueOf(123);
//包裝類轉(zhuǎn)基本數(shù)據(jù)類型(xxxValue()  float是floatValue() double是doubleValue())
int d = a.intValue();

以上的形式都是比較符合認(rèn)知的,獲取一個(gè)對(duì)象可以通過(guò)new或者調(diào)用某個(gè)方法,獲取一個(gè)值就調(diào)用對(duì)象的某個(gè)屬性。

Java 5.0之后可以不用這么麻煩了,增加了自動(dòng)裝箱和自動(dòng)拆箱的新特性,實(shí)際上兩個(gè)概念非常好理解。

int a = 10;
Integer b = a;  //自動(dòng)裝箱
int c = b;  //自動(dòng)拆箱

乍一看,對(duì)象=數(shù)值的這種形式并不符合認(rèn)知,但是借助于自動(dòng)裝箱和自動(dòng)拆箱就可以實(shí)現(xiàn)。實(shí)際上,編譯器還是借助于valueOf()和xxxValue()實(shí)現(xiàn)的。

我們來(lái)看一下valueOf()源碼。

/**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

valueOf()并不是簡(jiǎn)單地返回Integer對(duì)象,而是先進(jìn)行了一次判斷,輸入的數(shù)據(jù)符合某個(gè)范圍的話,將會(huì)返回一個(gè)特定的對(duì)象,從注釋上來(lái)看,這個(gè)范圍默認(rèn)是[-128,127],并且可能是更大的范圍;而超過(guò)這個(gè)范圍就會(huì)返回new的對(duì)象。而使用到的IntegerCache數(shù)據(jù)就是Integer的緩存了。

4. Interger緩存

數(shù)值計(jì)算日常使用比較頻繁,那如果不停的去new Integer對(duì)象的話,開銷會(huì)非常大,所以,Java在執(zhí)行程序時(shí)會(huì)自動(dòng)生成一個(gè)靜態(tài)數(shù)組作為緩存,Integer默認(rèn)對(duì)應(yīng)的緩存數(shù)組范圍在[-128,127],只要數(shù)據(jù)在這個(gè)范圍內(nèi),就可以從緩存中拿到相應(yīng)的對(duì)象。

看一下IntegerCache源碼。

/**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */
private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];
    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }
    private IntegerCache() {}
}

可以看到,IntegerCache是Integer的靜態(tài)內(nèi)部類,valueOf()調(diào)用的IntegerCache.cache就是一個(gè)數(shù)組對(duì)象,數(shù)組的大小取決于范圍內(nèi)的最大值和最小值,默認(rèn)是[-128,127],當(dāng)然,(注釋上說(shuō))也可以通過(guò)JVM修改這個(gè)范圍(這我不了解)。然后數(shù)組內(nèi)的元素都會(huì)被賦一個(gè)Integer對(duì)象,緩存也就形成了。

存在數(shù)組緩存,也就意味著,如果取值在[-128,127],使用valueOf()或者自動(dòng)裝箱創(chuàng)建的Integer對(duì)象都是在數(shù)組中取出,因此對(duì)象指向的內(nèi)存地址是完全一樣的。而如果用new或者是超出這個(gè)范圍都要重新創(chuàng)建對(duì)象。

當(dāng)然,不止Integer有緩存機(jī)制,Byte、Short、Long、Character都具有緩存機(jī)制。其中Byte,Short,Integer,Long的范圍為 -128 到 127,Character的范圍為 0 到 127。

5. 回答題目

Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a==b);
Integer c = 1;
Integer d = 1;
System.out.println(c==d);
Integer e = 128;
Integer f = 128;
System.out.println(e==f);

1.new創(chuàng)建的兩個(gè)對(duì)象,即使值相同,指向的內(nèi)存地址也是不同的,使用==進(jìn)行比較返回結(jié)果為false

2.自動(dòng)裝箱和緩存機(jī)制,兩個(gè)對(duì)象實(shí)際上是相同的,返回結(jié)果為true

3.超出緩存范圍,執(zhí)行時(shí)會(huì)new新對(duì)象,兩個(gè)對(duì)象不同,返回結(jié)果為false

到此這篇關(guān)于Java詳細(xì)分析講解自動(dòng)裝箱自動(dòng)拆箱與Integer緩存的使用的文章就介紹到這了,更多相關(guān)Java自動(dòng)裝箱內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法

    IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法

    這篇文章主要介紹了IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報(bào)錯(cuò)解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java的Hibernate框架中復(fù)合主鍵映射的創(chuàng)建和使用教程

    Java的Hibernate框架中復(fù)合主鍵映射的創(chuàng)建和使用教程

    復(fù)合主鍵映射用起來(lái)比普通的增加主鍵字段要復(fù)雜,這里我們就來(lái)共同學(xué)習(xí)Java的Hibernate框架中復(fù)合主鍵映射的創(chuàng)建和使用教程,需要的朋友可以參考下
    2016-07-07
  • Java之MyBatis入門詳解

    Java之MyBatis入門詳解

    這篇文章主要介紹了Java之MyBatis入門詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 詳解Java8合并兩個(gè)Map中元素的正確姿勢(shì)

    詳解Java8合并兩個(gè)Map中元素的正確姿勢(shì)

    這篇文章主要介紹了詳解Java8合并兩個(gè)Map中元素的正確姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java中使用RediSearch實(shí)現(xiàn)高效的數(shù)據(jù)檢索功能

    Java中使用RediSearch實(shí)現(xiàn)高效的數(shù)據(jù)檢索功能

    RediSearch是一款構(gòu)建在Redis上的搜索引擎,它為Redis數(shù)據(jù)庫(kù)提供了全文搜索、排序、過(guò)濾和聚合等高級(jí)查詢功能,本文將介紹如何在Java應(yīng)用中集成并使用RediSearch,以實(shí)現(xiàn)高效的數(shù)據(jù)檢索功能,感興趣的朋友跟著小編一起來(lái)看看吧
    2024-05-05
  • SpringBoot集成整合JWT與Shiro流程詳解

    SpringBoot集成整合JWT與Shiro流程詳解

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問(wèn)題,這篇文章主要介紹了SpringBoot集成JWT、Shiro框架的使用
    2022-12-12
  • java算法之二分查找法的實(shí)例詳解

    java算法之二分查找法的實(shí)例詳解

    這篇文章主要介紹了java算法之二分查找法的實(shí)例詳解的相關(guān)資料,這里提供簡(jiǎn)單實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • Spring Cloud入門教程之Zuul實(shí)現(xiàn)API網(wǎng)關(guān)與請(qǐng)求過(guò)濾

    Spring Cloud入門教程之Zuul實(shí)現(xiàn)API網(wǎng)關(guān)與請(qǐng)求過(guò)濾

    這篇文章主要給大家介紹了關(guān)于Spring Cloud入門教程之Zuul實(shí)現(xiàn)API網(wǎng)關(guān)與請(qǐng)求過(guò)濾的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-05-05
  • java使用OpenCV從視頻文件中獲取幀

    java使用OpenCV從視頻文件中獲取幀

    這篇文章主要為大家詳細(xì)介紹了java使用OpenCV從視頻文件中獲取幀,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • elasticsearch kibana簡(jiǎn)單查詢講解

    elasticsearch kibana簡(jiǎn)單查詢講解

    今天小編就為大家分享一篇關(guān)于elasticsearch kibana簡(jiǎn)單查詢講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02

最新評(píng)論

中超| 建湖县| 四子王旗| 九江市| 福泉市| 米林县| 旬邑县| 锦州市| 册亨县| 蒙自县| 鄂尔多斯市| 阿坝| 镇宁| 安溪县| 赤城县| 民乐县| 邮箱| 米林县| 建德市| 南城县| 哈密市| 诏安县| 潞城市| 四会市| 台湾省| 荃湾区| 蚌埠市| 林甸县| 贡山| 兖州市| 诸城市| 东乡县| 宁化县| 酒泉市| 比如县| 永兴县| 乌审旗| 清丰县| 怀仁县| 巍山| 宁武县|