手动写的equals和自动生成的equals的区别
手动有漏洞:可能比较的值都相同但是类名不同
比如下面的user类有两个属性 String name; int age;
user 类有个父类person
他也是这两个属性 String name; int age;
由于比较的是 this.age == u.age && this.name.equals(u.name)
class User {
String name;
int age;
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof User) {
User u = (User) obj;
return this.age == u.age && this.name.equals(u.name);
}
return false;
}
}
可能这两个要进行比较的对象,他们的属性值相同,但是这两个对象一个是person类型的,一个是user类型的,在手动写的代码里instaceof判断时时没有问题的所以代码可以顺利执行下去,但事实上一个是user,一个是person,他们连类型都不一样,属性值一样并不代表他们就完全euqual了。
综上所述,手写的equal方法是有问题的。
下面是正确的例子
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Account other = (Account) obj;
if (Double.doubleToLongBits(annuallnterestRate) != Double.doubleToLongBits(other.annuallnterestRate))
return false;
if (Double.doubleToLongBits(balance) != Double.doubleToLongBits(other.balance))
return false;
if (id != other.id)
return false;
return true;
}
其中
if (getClass() != obj.getClass())
return false;
确保了要判断的两个对象他们的类名一致