分别执行:
- 没有重写equals也没有重写hashCode
aa行:输出false
- 重写equals没有重写hashCode
aa行:输出true;
此时借助Set来观察是否有区别:属性值相同的两个对象hashCode不相等,导致Set中出现重复存储
- 重写equals也重写hashCode
aa行:输出true;
此时Set中只有一个[Student: id = 1, name = 张三]
import java.util.HashSet;
import java.util.Iterator;
// 为什么重写equals要重写hashCode?
public class Why {
public static void main(String[] args) {
Student s1 = new Student(001, "张三");
Student s2 = new Student(001, "张三");
System.out.println(s1.equals(s2)); // aa
System.out.println("------");
HashSet<Student> students = new HashSet<>();
students.add(s1);
students.add(s2);
Iterator iterator = students.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toString());
}
System.out.println("------");
}
}
class Student {
private int id;
private String name;
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
// 基于id来判断两个对象是否相同
@Override
public boolean equals(Object obj) {
return obj.equals(id);
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return id;
}
@Override
public String toString() {
return "[Student: id = " + id + ", name = " + name + "]";
}
}