Java Integer 源代码分析

概述

  本文是对Java1.8的Integer类的源代码进行详细分析。Integer是对Java的8种基本类型(byte, short, char, int, long, float, double, bool)中的int的包装类。对于两者之间的自动装箱拆箱的操作,本文不做介绍。只会介绍源代码中的一些有趣的函数实现、cache机制和其他的一些内容。

与string的相互转化

位运算

Integer源代码中有很多位运算的函数,大部分都是参考《Hacker's Delight》中的算法来实现的。很值得研究。下面对每一个函数进行分析。

cache

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

  从上面的代码中,可以发现在请求int的包装对象时,Integer内部有一个叫IntegerCache的私有内部类来做一部分对象的缓存。当第二次请求同样整数的Integer包装对象时,会返回同一个对象。也就是说,使用==运算符时,会返回true。这个缓存只有在第一次使用时,才会初始化。从代码中可以看到是使用静态代码块的方式,进行初始化的,并且只有静态字段。

  缓存的范围默认位-128 ~ 127,其中最大值是可以通过jvm的启动参数-XX:AutoBoxCacheMax来控制,但是最小不能小于127。从代码中可以看到,缓存是通过一个数组来实现的,因此,能够缓存的最大值,理论上是Integer.MAX_VALUE - 128 - 1

其他

总结

本文详细分析了JDK中Integer的源代码的大部分实现。可以发现,里面有很多使用打表位操作来优化的情况,很值得学习。
源代码中还有一些牵扯到unsigned的部分没有涉及。