Long源碼與常見問題

Long源碼與常見問題

Long的緩存

Long 最被我們關注的就是 Long 的緩存問題,Long 自己實現了一種緩存機制,緩存了從 -128 到 127 ,即 -2~ 2-1 內的所有 Long 值,如果是這個範圍內的 Long 值,就不會初始化,而是從緩存中拿,緩存初始化源碼如下:

private static class LongCache {
    private LongCache(){}

    static final Long cache[] = new Long[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Long(i - 128);
    }
}

面試題

爲什麼使用 Long 時,大家推薦多使用 valueOf 方法,少使用 parseLong 方法

答:因爲 Long 本身有緩存機制,緩存了 -128 到 127 範圍內的 Long,valueOf 方法會從緩存中去拿值,如果命中緩存,會減少資源的開銷,parseLong 方法就沒有這個機制。


Long#valueOf源碼如下

public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // 從緩存中取
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章