帮你搞懂Java中重写equals方法为什么要重写hashcode方法?
话不多说,直接上例子,包你懂
首先我们只重新equals()方法
public class Student {
private String name;
private int age;
private String QQ;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name) &&
Objects.equals(QQ, student.QQ);
}
看我们的测试类
public class Test {
public static void main(String[] args) {
Student student = new Student();
Student student2 = new Student();
System.out.println(student.equals(student2));
System.out.println(student.hashCode());
System.out.println(student2.hashCode());
HashMap<Student, String> map = new HashMap<>();
map.put(student,"123");
map.put(student2,"456");
System.out.println(map.get(student));
System.out.println(map.get(student2));
}
}
依次输出
true
356573597 student 的hashcode值
1735600054 student 2的hashcode值
123
456
是否出现矛盾???
用equals比较说明对象相同,但是在HashMap中却以不同的对象存储(没有重写hascode值,两个hascode值,在他看来就是两个对象)。
到底这两个对象相等不相等????
说明必须重写hashCode()的重要性,
接下来重写重写equals方法和hashCode方法,再比较
public class Student {
private String name;
private int age;
private String QQ;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name) &&
Objects.equals(QQ, student.QQ);
}
@Override
public int hashCode() {
return Objects.hash(name, age, QQ);
}
}
测试类
public class Test {
public static void main(String[] args) {
Student student = new Student();
Student student2 = new Student();
System.out.println(student.equals(student2));
System.out.println(student.hashCode());
System.out.println(student2.hashCode());
HashMap<Student, String> map = new HashMap<>();
map.put(student,"123");
map.put(student2,"456");
System.out.println(map.get(student));
System.out.println(map.get(student2));
}
}
依次输出
true
29791 //相同的对象
29791
456 //说明以一个值key存储,相同的值
456
看到这里,同学 你懂了吗? 还不懂,可以自己实现一遍代码。