java源码学习-Long

缓存

Long 最被我们关注的就是 Long 的缓存问题,Long 自己实现了一种缓存机制,缓存了从 -128 到 127 内的所有 Long 值,如果是这个范围内的 Long 值,就不会初始化,而是从缓存中拿,缓存初始化源码如下:

之前的:

private static class LongCache {
    private LongCache(){}
    // 缓存,范围从 -128 到 127,+1 是因为有个 0
    static final Long cache[] = new Long[-(-128) + 127 + 1];

    // 容器初始化时,进行加载
    static {
        // 缓存 Long 值,注意这里是 i - 128 ,所以再拿的时候就需要 + 128
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Long(i - 128);
    }
}

目前的:

 private static class LongCache {
        // -128 - 127 共 256个元素
        static final Long[] cache = new Long[256];

        private LongCache() {
        }

        //容器初始化 进行加载
        static {
            for(int i = 0; i < cache.length; ++i) {
                cache[i] = new Long((long)(i - 128));
            }

        }
    }

Long重写的equals方法

public boolean equals(Object obj) {
    //判断数据类型
        if (obj instanceof Long) {
            return this.value == (Long)obj;
        } else {
            return false;
        }
    }

这里来看一个小问题:

        Long id1 = 127L;
        Long id2 = 127L;
        Long id3 = 128L;
        Long id4 = 128L;
//就是因为Long存在一个默认的常量池,大小是(-128~127),
//自动装箱(valueOf)时此范围的值都是从常量池中取的
        System.out.println(id1 == id2);
        System.out.println(id1.equals(id2));

        System.out.println(id3 == id4);
//Long的equals比较的是value
        System.out.println(id3.equals(id4));
输出:
        true
        true
        false
        true

面试题:

1. 为什么使用 Long 时,大家推荐多使用 valueOf 方法,少使用 parseLong 方法?

答:因为 Long 本身有缓存机制,缓存了 -128 到 127 范围内的 Long,valueOf 方法会从缓存中去拿值,如果命中缓存,会减少资源的开销,parseLong 方法就没有这个机制。
附源码:

public static Long valueOf(long l) {
        int offset = true;
        return l >= -128L && l <= 127L ? Long.LongCache.cache[(int)l + 128] : new Long(l);
    }

2. 如何解决 String 乱码的问题

答:乱码的问题的根源主要是两个:字符集不支持复杂汉字、二进制进行转化时字符集不匹配,所以在 String 乱码时我们可以这么做:

  1. 所有可以指定字符集的地方强制指定字符集,比如 new String 和 getBytes 这两个地方;
  2. 我们应该使用 UTF-8 这种能完整支持复杂汉字的字符集。

3. 为什么大家都说 String 是不可变的

答:主要是因为 String 和保存数据的 char 数组,都被 final 关键字所修饰,所以是不可变的。

你可能感兴趣的:(java源码学习-Long)