1.看下面的代码,输出什么呢?
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);
答案是: 输出 false。
为什么n1和n2的值相同,用“==”比较结果却是false呢?
因为“==”比较的不是对象的值,而是对象的引用。而n1和n2引用两个不同的对象。
2.如果想比较两个对象的实际内容是否相同,如何操作呢?
用对象的通用比较方法:equals()方法。
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));
输出为true。
3.但是注意,equals()方法不能用于基本类型。比如下面这样是不行的,因为equals()方法是类的方法。
int a = 1;
int b = 1;
System.out.println(a.equals(b)); //编译不通过
4.用equals()来比较对象内容是否相同,是不是适用于所有的类呢?答案是并非适用于所有的类。
看下面的例子:
class Value {
int i;
}
public class CompareMethod{
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
}
输出为false!是的,为什么和上面第二步的结果不一样呢?
因为Java类的equals()方法默认的行为也是比较引用。参见Java Object类的equals()方法:
public boolean equals(Object obj)
{
return this == obj;
}
而上面用到的Integer类里其实是覆盖了equals()方法的,覆盖后它被用来比较内容。而我们自定义的Value类并没有覆盖equals()方法,用的还是Object类的equals()方法。
(大多数java类库都覆盖了equals方法,用来比较对象内容而非对象的引用。)
所以,要想让我们自定义的类在比较内容时表现出我们想要的样子,就得覆盖equals()方法。