Javaカスタムオブジェクトをマップのキーとして使用する場合、equals()メソッドとhashCode()メソッドを書き直す必要があります

  Javaクラスは、Studentという名前のプロジェクトで、属性stuNm(名前)と年齢(年齢)を使用してカスタマイズされます。オブジェクトをキーとして使用し、スコアを値としてマップに格納した後、学生オブジェクトに基づいてスコアを取得するシーンがあります。名前と年齢が同じである限り、彼らは同じ学生と見なされます。
  マップ内のアクセス値は、キーのhashCode値に基づいており、計算後に対応するバケットに格納されます(Java 8より前)。上記のシナリオでは、studentオブジェクトをマップのキーとして使用する場合、hashCodeメソッドとequalsメソッドを書き直す必要があります。stuNmとageが同じ場合、オブジェクトは等しいと見なされ、hashCode値は等しくなります。
  equals()メソッドとhashCode()メソッドをすばやく生成する方法については、「IDEAがJavaクラスのequals()メソッドとhashCode()メソッドをすばやくオーバーライドする」を参照してくださいStudentクラスと、書き直されたequals()メソッドとhashCode()メソッドを以下に示します。

package com.test.model;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Student {
    
    

    // 姓名
    private String stuNm;

    // 年龄
    private String age;

    // 构造函数
    public Student(String stuNm, String age) {
    
    
        this.stuNm = stuNm;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (!(o instanceof Student)) return false;

        Student student = (Student) o;

        if (stuNm != null ? !stuNm.equals(student.stuNm) : student.stuNm != null) return false;
        return age != null ? age.equals(student.age) : student.age == null;
    }

    @Override
    public int hashCode() {
    
    
        int result = stuNm != null ? stuNm.hashCode() : 0;
        result = 31 * result + (age != null ? age.hashCode() : 0);
        return result;
    }
}

  試験方法を以下に示します。

package com.test.model;

import java.util.HashMap;
import java.util.Map;

public class Test {
    
    

    public static void main(String[] args) {
    
    

        Map<Student, String> map = new HashMap<>();

        Student stuA = new Student("张三", "20");
        map.put(stuA, "95");

        Student stuB = new Student("张三", "20");
        map.put(stuB, "93");

        System.out.println(map.get(stuA));      // 93
        System.out.println(map.get(stuB));      // 93

        Student stuC = new Student("张三", "20");
        System.out.println(map.get(stuC));      // 93
        System.out.println(stuA.equals(stuC));  // true
    }
}

  さまざまな学生オブジェクトにZhangSanという名前が付けられ、年齢は20歳です。equals()とhashCode()が書き直されているため、Mapのput()操作とget()操作が実行されると同じキーと見なされます。値93です。

おすすめ

転載: blog.csdn.net/piaoranyuji/article/details/107840476