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));    //true
        System.out.println(student.hashCode());            //356573597
        System.out.println(student2.hashCode());           //1735600054 
        HashMap 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値は書き換えられていません.2つのhascode値は、彼から見れば2つのオブジェクトです).果たしてこの2つのオブジェクトは等しいかどうか???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));   //true
        System.out.println(student.hashCode());          // 29791   
        System.out.println(student2.hashCode());       // 29791   
        HashMap map = new HashMap<>();
        map.put(student,"123");
        map.put(student2,"456");
        System.out.println(map.get(student));   //456
        System.out.println(map.get(student2)); //456

    }
}


ちくじしゅつりょく
true
29791           //     
29791
456			  //      key  ,    
456

ここを見て、同級生は分かりましたか.まだ分からないので、自分でコードを実現することができます.