先看一个demo:
public class Equivalence {
public static void main(String args[]) {
Integer n1 = new Integer(24);
Integer n2 = new Integer(24);
int i = 2;
int j = 2;
System.out.print(n1 == n2); // false
System.out.print(n1.equals(n2)); // true
System.out.print (i == j); // true
}
噢,从输出结果看出来了:“==”或“!=”比较的是栈上的内容,直接用于对象比较的话比较的是对象的引用,用于基本类型就是比较的值;那对的象内容怎么比较?使用equal()方法可达到目的。
貌似明白了点,继续来个demo:
public class Value {
int i;
}
public class Equivalence {
public static void main(String args[]){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.print(v1.equals(v2)); // false
}
一个令人费解的答案…原来 equal() 的默认行为是比较引用,所以除非在自己的新类中覆盖了 equal() 方法,否则不可能表现出我们希望的行为。这里的Value类是自己新建的一个类,由于没覆写 equal() 方法,所以比较的是 v1 和 v2 的引用,输出为 false。
总结:
(1)“==”或“!=”比较的是栈上的内容,可直接用于基本类型值的比较,用于对象比较时是比较的对象的引用;
(2)equal()默认行为比较的是引用,在新类中覆盖equal()方法,用于对象内容的比较,可实现equal()比较对象内容的行为。