先决条件: HashMap,HashMap的内部工作
如果我们希望创建一个HashMap自己的类,我们需要确保HashMap的hashcode()的关键并没有改变,如果发生改变,就不可能从HashMap中获得key的对象值。
在运行时,JVM处理每个对象的hash code并对其感兴趣。当我们改变对象的状态时,JVM会再次计算其hash code,这可能导致内存泄漏。让它正常工作我们需要做的是确保一个key对象的状态改变不会改变对象的hash code,也就是说,这个key必须正确地覆盖equals()和hashcode()方法才能正常工作。
//用于创建Java HashMap的示例 //用户定义类类型 import java.util.*; import java.io.*; //用户定义的类 public class CustomKeyObject { public static class Student { private int rollno; private String name; // Constructor public Student(int rollno, String name) { = rollno; = name; } public String getname() { return ; } public int getmarks() { return ; } public void setname(String name) { = name; } public void setmarks(int rollno) { = rollno; } // 覆盖hashcode()函数 @Override public int hashCode() { // 使用roll no来验证唯一性 //学生类的对象 final int temp = 14; int ans = 1; ans = temp * ans + rollno; return ans; } //平等对象必须生成相同的对象 //hash code只要它们相等 @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null) { return false; } if () != o.getClass()) { return false; } Student other = (Student)o; if ( != o) { return false; } return true; } } // 主要方法 public static void main(String[] args) throws NumberFormatException, IOException { HashMap<Student, String> map = new HashMap<>(); Student one = new Student(1, "Geeks1"); // key1 Student two = new Student(2, "Geeks2"); // key2 // put keys in map map.put(one, one.getname()); map.put(two, ()); // 改变key状态 // hashcode() should be calculated again one.setname("Not Geeks1"); ("Not Geeks2"); // still prints Geeks1 Sy(one)); // still prints Geeks1 Sy(two)); // /尝试使用新创建的带有相同Rollno的键 Student three = new Student(1, "Geeks3"); // we get Geeks1 Sy(three)); } // This code is contributed by Subhesh }输出:
Geeks1 Geeks2 Geeks1