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です。