首页 > 解决方案 > 自定义对象作为 Map 键

问题描述

正如我所读到的,如果自定义对象需要成为 map 的键,则需要覆盖 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);
    }

正确的输出:

3-> 1 安

2-> 2 B

标签: javacollectionshashmapequalshashcode

解决方案


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

x.equals(x) == true 

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

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

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

s1.equals(s1) == true 

1被替换为3

但是,如果您这样做,结果会有所不同

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

s1.equals(new Student(1,"A")); 

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


推荐阅读