1、==
==是操作符,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址,也就是必须是同一个对象。
2、equals
如果没有对equals方法进行重写,比较的是引用类型的变量所指向的对象的地址;对于String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
注意:在重写equals方法的同时,必须重写hashCode方法,因为重写后equals的含义已经不一样了,equals是先比较hashCode,再进行equals比较,这是为了提高效率。如果不重写则可能会出现,equals相同,但hashCode不同,这会产生预期外的结果。
3、来个测试
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));
}
结论是:
1)true。
2)false。原因是大小在128以内的对象,再次创建时是直接取缓存内的数据,也就是c、d的地址是同一个。
3)true。
4)true。原因还是128以内数据。
5)true。
6)false。原因是类型不同。
7)true。类型自动转换。
// 附一段Long.java代码
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}