先看代码:
public static void main(String[] args) {
Integer a = new Integer(175);
Integer b = new Integer(175);
Integer c = new Integer(120);
Integer d = new Integer(120);
Integer z = 175;
Integer x = 175;
Integer n = 75;
Integer v = 75;
System.out.println("a.equals(b) : "+ a.equals(b));
System.out.println("a==b: " +(a==b));
System.out.println("c.equals(d) : "+ c.equals(d));
System.out.println("c==d: " +(c==d));
System.out.println("z==x: "+ (z==x));
System.out.println("n==v: "+(n==v));
System.out.println("z.equals(x): "+ z.equals(x));
System.out.println("n.equals(v): "+ n.equals(v));
}
结果:
a.equals(b) : true
a==b: false
c.equals(d) : true
c==d: false
z==x: false
x==v: true
z.equals(x): true
n.equals(v): true
什么原因呢:
Integer有个缓存机制 : -128~127
也就是说,当你声明两个Integer 对象(不使用new)时,如果值是在此范围之内, 使用"==" 结果是true ,但是一旦超过了此范围,则会在堆中重新声明一块地址,此时再用"==" 结果就会返回false
并且 使用"==" 比较两个值相等的使用 new Integer() 生命的对象时,即使值相等,结果也依然是false。因为这两个Integer对象其实是指向两块不同的内存地址的。 有点像String类型。
推荐 : 使用 equalse 比较两个 Integer的值
因为 使用equals 比较不管使用哪种声明方式,结果都可以理解为是比较声明的对象的值。
来看《阿里巴巴Java开发手册》的建议: