今天在书上看到一段代码,然后……就懵逼了,百度过后终于知道了为什么,分享给大家。
package com;
public class Test {
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));
System.out.println(g.equals(a + b));
}
}
运行结果:
true
false
true
true
true
false
首先第一个问题:为什么 c = d 而e != f ?
这里涉及到一个概念,常量池。Integer的常量池从-128到127。在这个范围的数字可以直接从常量池取得值。所以3 = 3。
然后不在这个范围的数字,会通过new Integer();进行包装,所以产生的是两个对象。
第二个问题:== 等号比的是什么?
==是值得比较,如果左右的值相同,则返回true。而这里大于127的数字被封装成了对象。所以两个不同的对象比较,所以返回false。
第三个问题:==与equals 的区别?
在object 中的equals方法,
boolean equals(Object o){
return this==o;
}
所以object 中的equals同==一样。具体实现,需要考虑object的子类是否重写equals方法。
最后一个问题:equals不会自动装箱。当然这也与实现方法有关。