自定义对象作为 Map 键

Kha*_*han 0 java collections equals hashmap hashcode

正如我读过的那样,如果自定义对象需要成为地图的键,则需要覆盖 hashcode 和 equals 方法,但在我的情况下,它可以在不覆盖它的情况下工作。有人能告诉我出了什么问题吗?

    Map<Student,Integer> map = new HashMap<>();
    Student s1=new Student(1,"A");
    Student s2=new Student(2,"B");
    Student s3=new Student(3,"C");

    map.put(s1,1);
    map.put(s2,2);
    map.put(s1,3);

    for(Student s:map.keySet()) {
        System.out.println(map.get(s) + "->" + s.id + " " +s.name);
    }
Run Code Online (Sandbox Code Playgroud)

正确的输出:

3-> 1A

2-> 2 B

Ant*_*iuc 5

它是方法的属性之一equals:它是自反的。意思就是

x.equals(x) == true 
Run Code Online (Sandbox Code Playgroud)

一个对象总是等于它自己。在这种情况下,您正在中继equals方法的默认实现。

map.put(s1,1); 
map.put(s1,3);
Run Code Online (Sandbox Code Playgroud)

并且因为默认实现是自反的

s1.equals(s1) == true 
Run Code Online (Sandbox Code Playgroud)

1被替换为3

然而,如果你做这样的事情,结果会有所不同

map.put(new Student(1,"A"),3);

s1.equals(new Student(1,"A")); 
Run Code Online (Sandbox Code Playgroud)

您将需要覆盖hashCodeequals使其正常工作。