Integer中valueOf與parseInt區(qū)別及其緩存策略

本文來聊一下Integer中的兩個常用的靜態(tài)方法valueOfparseInt绸狐,順便引出基本類型包裝類的緩存策略

前言

這篇文章的想法來源于一次代碼檢查,使用findbugs插件檢查代碼础倍,然后報了如下信息(不屬于bug,但是是一個更好的建議)

A boxed primitive is created from a String, just to extract the unboxed primitive value. It is more efficient to just call the static parseXXX method.

大致意思就是說把String類型轉(zhuǎn)換成了包裝類挪哄,而參數(shù)需要的是基本類型值私沮,所以用parseXXX方法更有效移怯。說實話這些方法很常用香璃,也比較簡單,就沒有去看過它們到底有什么區(qū)別舟误,直到這次偶然的機會增显。

源碼分析

先來看下面這兩個方法

public static Integer valueOf(String s) throws NumberFormatException {
    return Integer.valueOf(parseInt(s, 10));
}

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

可以看到將字符串類型轉(zhuǎn)換為Integer對象實則就是先去調(diào)用了parseInt(String s, int radix)方法,轉(zhuǎn)換為int基本類型后脐帝,再包裝為Integer對象。

看到這里其實就已經(jīng)解釋了上述findbugs的問題糖权,但是可以發(fā)現(xiàn)堵腹,valueOf方法中先進行了范圍判斷,通過 IntegerCache 這個類名我們可以知道星澳,這里做了緩存疚顷。

接下來先做個無獎競猜,猜猜下面兩行分別輸出什么

System.out.println(Integer.valueOf(100) == Integer.valueOf(100));
System.out.println(Integer.valueOf(200) == Integer.valueOf(200));

相信即使不熟悉的同學看到這里也必然知道有坑哈哈禁偎,結(jié)果自己驗證下就曉得了
那么就來看下 IntegerCache 到底做了什么

    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() {}
    }

Integer中默認緩存范圍為-128~127腿堤,新建一個數(shù)組,通過for循環(huán)緩存范圍內(nèi)的Integer對象如暖。
緩存最大值是可以通過設置

-Djava.lang.Integer.IntegerCache.high=xxx

來進行修改笆檀,該緩存會在首次使用Integer時初始化。
說到底這里做緩存是為了節(jié)省內(nèi)存盒至,提高性能酗洒,默認-128~127的范圍是因為該范圍內(nèi)的數(shù)字使用頻率較高士修。

那么既然Integer類有緩存,其他基本類型的包裝類是否也做了緩存呢樱衷?
去看一下其他包裝類的代碼棋嘲,答案是肯定的
Byte Short Long Character 都做了緩存,前三個范圍固定都是-128~127
Character 緩存范圍為0~127
并且只有IntegerCache的緩存范圍可配置

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矩桂,一起剝皮案震驚了整個濱河市沸移,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侄榴,老刑警劉巖雹锣,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牲蜀,居然都是意外死亡笆制,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門涣达,熙熙樓的掌柜王于貴愁眉苦臉地迎上來在辆,“玉大人,你說我怎么就攤上這事度苔〈衣ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵寇窑,是天一觀的道長鸦概。 經(jīng)常有香客問我,道長甩骏,這世上最難降的妖魔是什么窗市? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮饮笛,結(jié)果婚禮上咨察,老公的妹妹穿的比我還像新娘。我一直安慰自己福青,他們只是感情好摄狱,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著无午,像睡著了一般媒役。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宪迟,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天酣衷,我揣著相機與錄音,去河邊找鬼踩验。 笑死鸥诽,一個胖子當著我的面吹牛牡借,可吹牛的內(nèi)容都是我干的钠龙。 我是一名探鬼主播碴里,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼咬腋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了根竿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤醒颖,失蹤者是張志新(化名)和其女友劉穎壳炎,沒想到半個月后匿辩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铲球,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年溯饵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锨用。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡啄巧,死狀恐怖秩仆,靈堂內(nèi)的尸體忽然破棺而出噪珊,到底是詐尸還是另有隱情齐莲,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響怀偷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜀踏,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一果覆、第九天 我趴在偏房一處隱蔽的房頂上張望斑响。 院中可真熱鬧薛耻,春花似錦饲漾、人聲如沸考传。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伙菊。三九已至败玉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間镜硕,已是汗流浹背运翼。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兴枯,地道東北人血淌。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像财剖,于是被迫代替她去往敵國和親悠夯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容