Java Integer比较

今天看微信做了一个选择题,对Integer比较结果有点意外,题目如下:

public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c == (a + b));
        System.out.println(c.equals(a + b));
        System.out.println(g == (a + b));
}

//output:
true
false
true
true
true

 怎么也想不明白为什么c == d为true,而e == f却为false。然后测试了几个不同的数值,到127时还是true而当值为128时结果就为false了。而128刚好是2^7,因此应该是有个范围的。

然后Google了一下,看到大家的解答才恍然大悟,原来在java中,在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。

而valueOf()函数的源码为:

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

这样可以发现对传入参数i做了一个判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。所以出现了上面比较e,f返回false的结果。

 

posted @ 2016-03-28 19:43  江湖小妞  阅读(317)  评论(0编辑  收藏  举报