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);
}

猜你喜欢

转载自blog.csdn.net/lik_lik/article/details/106951394