Java_装箱,拆箱

public static void main(String[] args){
        Integer i1 = 127;
        Integer i2 = 127;
        Integer i3 = 128;
        Integer i4 = 128;

        System.out.println(i1 == i2);
        System.out.println(i3 == i4);

        Double d1 = 127.0;
        Double d2 = 127.0;
        Double d3 = 128.0;
        Double d4 = 128.0;

        System.out.println(d1 == d2);
        System.out.println(d3 == d4);
}

结果是

true
false
false
false

产生这样的结果的原因是:Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法是以128位分界线做了缓存的,假如是[-128,127]区间的值是会取缓存里面的引用的,以Integer为例,其valueOf(int i)的源代码为:

static final int low = -128;

static final int high=127;

public static Integer valueOf(int i) {

    if (i >= IntegerCache.low && i <= IntegerCache.high)

        return IntegerCache.cache[i + (-IntegerCache.low)];

    return new Integer(i);

}

而Float、Double不会的原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。

你可能感兴趣的:(Java_装箱,拆箱)