如果想要判断堆中两个对象的内容是否一样,需要重写equals()方法,根据哈希约定,如果两个对象的equals()相等,那么这两个对象的hashCode()也应该相等,即重写equals()的同时,也要重写hashCode()
快捷键:Alt+Shift+s->Generate hashCode() and equals()
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((gender == null) ? 0 : gender.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)//两个引用指向同一个对象 p3=p1;
return true;
if (obj == null)//参数对象为null
return false;
if (getClass() != obj.getClass())//类型不一致
return false;
Person other = (Person) obj;//对象的向下转型(强制类型转换)
if (age != other.age)//类型相同时判断每个字段是否相同
return false;//年龄不相等直接返回false
if (gender == null) {
if (other.gender != null)//当前对象gender为null,参数对象的gender不为null
return false;
} else if (!gender.equals(other.gender))//当前对象gender不为null,单是和参数对象的gender不相等
return false;
if (name == null) {
if (other.name != null)//当前对象name为null,参数对象的name不为null
return false;
} else if (!name.equals(other.name))//当前对象name不为null,单是和参数对象的name不相等
return false;
return true;//排除上述情况,剩余的为相等情况返回true
}