一、Integer与Integer的比较
在使用Integer类型时,常常会不经意就使用==来做判断条件,但是下面的代码就出乎了我们的意料:
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println("a==b:\t"+(a==b));
System.out.println("c==d:\t"+(c==d));
我们预期的结果是不是 true true?
实际结果:
为什么会产生这样的问题?
是因为在java常量池中默认缓存了-128~127之间的整数,当Integer类型的对象值在此区间时,对象会直接去读取常量池的值,所以使用==比较时他们都指向同一个地址,但是一旦超出这个范围,Integer就会创建一个新的对象,这时两个Integer对象的地址就不同了,因此结果为false。
换种方式,我们使用Integer对象的equals方法再试一试:
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println("a==b:\t"+(a==b));
System.out.println("c==d:\t"+(c==d));
System.out.println("a.equals(b):\t"+a.equals(b));
System.out.println("c.equals(d):\t"+c.equals(d));
这次的结果应该很明显了,equals()比较的是两个对象中的值,输出结果: