用途
涉及到两个对象的比较的时候,一般需要重写equals方法。
示例
package equals;
public class Person {
private String name;
private String age;
public String
getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String
getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (
this == obj)
return true;
if (obj ==
null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age ==
null) {
if (other.age !=
null)
return false;
}
else if (!age.equals(other.age))
return false;
if (name ==
null) {
if (other.name !=
null)
return false;
}
else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int hashCode() {
final int prime =
31;
int result =
1;
result = prime * result + ((age ==
null) ?
0 : age.hashCode());
result = prime * result + ((name ==
null) ?
0 : name.hashCode());
return result;
}
}
这里要注意的是重写equals方法一定要重写hashcode方法。因为散列码(hashcode)是由对象导出的一个整数值,它是没有规律的。每个对象基本上对应唯一的一个散列码。因此重写equals与hashcode定义必须一致:如果a.equals(b)返回true,那么a.hashcode()和b.hashcode()必须具有相同的值。
另一种写法
@Override
public boolean equals(Object obj) {
if (
this == obj)
return true;
if (obj ==
null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
return Objects.equals(age, other.age)&&Objects.equals(name, other.name);
}
@Override
public int hashCode() {
return Objects.hash(name,age);
}
equals比较内容的时,直接调用Objects的equals的方法来比较, 返回hashcode时调用Objects的hash方法来组合散列码。这两个方法的实现原理可以直接查看源码,也不复杂,有兴趣的同学可以去看看。