给大家出一道小儿科的题:
public class TestInteger {
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;
long h = 2L;
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));
System.out.println(g.equals(a + b));
System.out.println(g.equals(a + h));
}
}
答案是多少呐,你一定在嘀咕这还不简单呐,答案是
true
false
如果你这样想,我只能说你还太嫩,首先不公布答案呐,最后在公布,先分析分析
1.我们知道在编码的时候能不用integer就不用这种包装类,因为它有个装箱和拆箱的过程,会浪费时间,
2.Integer的缓存范围大家想必都知道就是-128(-2的7次方)到127(2的7次方-1)超出这个范围就会在堆中重新分配内存,所以比较的值超出这个范围地址就会不一样
------------------------------------------------------------------------------------
再来说一下==这种运算法的比较,它的比较会先比较地址值,
如果比较的一边有操作表达式,会比较数值
再来说一下equals
它在比较的时候会优先比较数值
但是Long类型的equals会首先判断是否属于Long,
------------------------------------------------------------------
好了公布正确答案
最后一个的解释是,a+h,a是Integer,h是Long,在进行运算时,会自动转化为Long类型的进行运算,所以是true
而倒数第二个a+b都是intrger类型的,所以不会进行转化,所以还是Integer类型的与Long类型没法比较。