本帖最后由 杨锦 于 2012-8-1 13:45 编辑
在我们使用运算符“==”来比较两个对象时,其实比较的是两个对象的地址。如果运算符两边是同一个对象,地址相同则会等到true,只要是不同对象地址就会不同,返回false。
我们在编程过程中经常会比较两个对象的属性,这时我们就无法用“==”来比较了,因为即使两个对象所有属性都相同但不是同一个对象“==”号比较后也会得到false。这种情况下我们一般会定义一个equals()方法来进行比较。
楼主看看下面这个例子
class EqualsDemo {
public static void main(String[] args) {
Person p1 = new Person("张三", 19);
Person p2 = new Person("张三", 19);
System.out.println(p1); // 打印toString返回值
System.out.println(p2);
System.out.println(p1 == p2); // 比较是否地址相同
System.out.println(p1.equals(p2)); // 使用自定义的equals比较属性是否完全相同
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Person(" + name + ", " + age + ")";
}
@Override
public boolean equals(Object obj) {
if (this == obj) // 地址相同, 代表是同一个对象, 属性肯定相同, 没必要再比较了, 直接返回true
return true;
if (obj == null) // 传入的对象如果为空, 不用比较直接返回false
return false;
if (!(obj instanceof Person)) // 如果obj不是Person类型, 直接返回false
return false;
Person other = (Person)obj; // 为了访问name和age, 先将Object类型的实参强转回Person类型
if (this.name == null) { // 如果名字一个为null另一个不为null, 返回false
if (other.name != null)
return false;
} else if (!this.name.equals(other.name)) // 如果name不同, 返回false
return false;
if (this.age != other.age) // 如果age不同, 返回false
return false;
return true; // 上面如果没有返回, 就代表属性都相同, 返回true
} |