成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

背景和問題

 在看別人整理的資料時(shí),看到如下一段代碼:

在陵川等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)整合營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,陵川網(wǎng)站建設(shè)費(fèi)用合理。

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

package com.sitech.test;/**
 * 自動(dòng)裝箱和拆箱 jdk1.6
 * @author liaowp
 * */public class TestInteger {    public static void main(String[] args) {
        Integer i1 = 80, i2 = 80, i3 = 999, i4 = 999;
        System.out.println(i1 == i2);//true
        System.out.println(i3 == i4);//false    }
}

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

 如果沒有看過源碼的同學(xué)肯定覺的答案要么是2個(gè)true要么是2個(gè)false。我剛看到這一段代碼的時(shí)候也覺的是2個(gè)true,感覺自己100%確定,不過真正運(yùn)行之后才發(fā)現(xiàn)傻眼了,一個(gè)true一個(gè)false,這是Bug吧。其實(shí)LZ以前看過一部分Integer源碼了,但是現(xiàn)在想想好像看的不認(rèn)真,尷尬了。于是被這個(gè)問題觸發(fā)了LZ要認(rèn)真看一次Integer源碼了(我要認(rèn)真了,哈哈)。

 我們還是回到上面那個(gè)問題吧,先把問題解決了在吹nb。我們可以看到上面的代碼4個(gè)變量都是Integer的引用,所以輸出的==運(yùn)算比較的不是Integer值而是Integer引用。裝箱的本質(zhì)是什么呢?當(dāng)我們給一個(gè)Integer對(duì)象賦一個(gè)int值的時(shí)候,會(huì)調(diào)用Integer類的靜態(tài)方法valueOf,我們看一看valueOf方法就知道為什么會(huì)有這樣的結(jié)果了。

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

    /**
     * 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) {//是一個(gè)靜態(tài)方法 IntegerCache是一個(gè)內(nèi)部類        assert IntegerCache.high >= 127;//斷言  參考http://lavasoft.blog.51cto.com/62575/43735/        if (i >= IntegerCache.low && i <= IntegerCache.high)//如果i大于對(duì)于IntegerCache.low()且i小于等于IntegerCache.high            return IntegerCache.cache[i + (-IntegerCache.low)];//直接從緩存取出來        return new Integer(i);//新創(chuàng)建一個(gè)Integer對(duì)象
    }

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

 從上面的代碼中我們可以看出Integer維持了一個(gè)緩存系統(tǒng),如果在緩存的范圍內(nèi)直接取出來就好了,雅思培訓(xùn)機(jī)構(gòu)如果不在的就要?jiǎng)?chuàng)建新的Integer對(duì)象。但是具體緩存范圍是什么的,我們?cè)谏钊脒M(jìn)去看看:

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

    /**
     * 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 -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 {//靜態(tài)類哦        static final int low = -128;//最小值是-128        static final int high;//最高        static final Integer cache[];//緩存數(shù)組  這三個(gè)都final,不可修改的        static {//靜態(tài)代碼塊   靜態(tài)代碼塊會(huì)比改造方法先執(zhí)行            // high value may be configured by property
            int h = 127;//默認(rèn)的
            String integerCacheHighPropValue =//定義一個(gè)String 
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");//取得設(shè)置的值            if (integerCacheHighPropValue != null) {//如果設(shè)置了就用設(shè)置的值                int i = parseInt(integerCacheHighPropValue);//把String轉(zhuǎn)換為int
                i = Math.max(i, 127);//獲得i和127的更大的一個(gè),其實(shí)是不能小與默認(rèn)的                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low));//如果取的小的那個(gè),不能超過Integer的最大值+low
            }
            high = h;//最大值為127

            cache = new Integer[(high - low) + 1];//創(chuàng)建緩存數(shù)組大小            int j = low;//最小值            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);//緩存初始化
        }        private IntegerCache() {}//私有構(gòu)造
    }

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

問題解決

由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼

Integer的緩存

 看完之后我相信基本都知道為啥一開始的那一段代碼會(huì)這樣了,我現(xiàn)在做一個(gè)小的總結(jié),Integer里面有一個(gè)內(nèi)部類IntegerCache,是用來做緩存優(yōu)化性能的。默認(rèn)緩存了-128到127中間的數(shù)字,據(jù)說這些使的比較頻繁。其實(shí)java里面好多的類都有這樣的優(yōu)化。如果在-128-127之間的就直接拿緩存的,不在的就new一個(gè)Integer。所以這也就解釋了上面的那個(gè)問題了嘛

當(dāng)前標(biāo)題:由自動(dòng)裝箱和拆箱引發(fā)我看Integer源碼
URL鏈接:http://jinyejixie.com/article44/gpidee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序網(wǎng)站營(yíng)銷、虛擬主機(jī)自適應(yīng)網(wǎng)站、動(dòng)態(tài)網(wǎng)站靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)
太仆寺旗| 佳木斯市| 甘洛县| 麻城市| 剑河县| 平潭县| 隆子县| 牙克石市| 万源市| 新蔡县| 苍南县| 出国| 富宁县| 通城县| 浦城县| 论坛| 安岳县| 化隆| 奈曼旗| 石泉县| 公主岭市| 沽源县| 丹凤县| 通辽市| 浮梁县| 雅安市| 米林县| 宾川县| 邮箱| 高清| 洞头县| 丹阳市| 二手房| 河西区| 南木林县| 韩城市| 聂拉木县| 江源县| 正镶白旗| 商南县| 保靖县|