参考学习
假如没有重写equals方法,那么equals方法跟==没有区别,都是比较对象的内存地址。
//Object中的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
如果我们希望看到数据相同时,两个对象就判定为相同,那么就需要重写equals方法。
举个例子:
@Override
public boolean equals(Object obj){
if(obj instanceof Person){
Person person=(Person)obj;
return x==person.x;
}
return false;
}
当然这个例子很简单,不同的类equals都不一样,有时候甚至还要考虑到继承的关系。具体的重写步骤Effective Java中有推荐。
仅仅是这样重写equals是不够的,我们期望这两个对象是相同的,但是实际上他们的hashcode是不一样的。那么像HashMap、HashSet这样的集合就会认为这是两个不一样的对象,会对他们进行分别存储。
public static void main(String[] args) {
Person p1=new Person(1);
Person p2=new Person(1);
System.out.println(p1.equals(p2));//true
Map<Person,Integer> map=new HashMap<>();
map.put(p1,1);
map.put(p2,1);
System.out.println(map.size());//2
}
因此我们还需要重写hashcode方法。
@Override
public int hashCode() {
int res=17;
res=31*res+x;
return res;
}
测试:
public static void main(String[] args) {
Person p1=new Person(1);
Person p2=new Person(1);
System.out.println(p1.equals(p2));//true
Map<Person,Integer> map=new HashMap<>();
map.put(p1,1);
map.put(p2,1);
System.out.println(map.size());//1
}