覆盖equals方法不能在hashmap中使用对象作为键起作用吗?

时间:2019-02-24 16:35:28

标签: java collections

我有一个Person类的Overrided equals方法,该类比较class的name属性,如果相等,则从equals方法返回true。

当我创建Person对象的实例并将其用作hashmap中的键时,在使用具有相同名称的新对象进行检索时,我无法从hashMap中检索关联的值。

下面是我的

function_two

导入java.util.Map;

公共类ToStringTest {

import java.util.HashMap;

}

班级人物{

public static void main(String[] args) {

    Person person = new Person("Jack", "California");
    Map<Person,String> personsMap = new HashMap<>();
    personsMap.put(person,"MyCar");
   Person otherPerson = new Person("Jack", "California");
    System.out.println(personsMap.get(otherPerson));
}

}

这是在使用otherPerson对象进行检索时打印null。

有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分:0)

首先,如果key不为null,则在地图personsMap.put(person,"MyCar");中添加新人物时,将确定放置元素的位置。通过调用密钥的hashcode方法来确定。之后有几个步骤,但是对于本示例来说并没有关系。

由于您没有覆盖hashcode(),因此personotherPerson将具有不同的hashcode

当您尝试通过某些键获取价值时,也会发生同样的情况。为了找到元素所在的位置,将调用hashcode()。但是otherPerson具有不同的hashcode,它将导致没有项目(null)的位置

equals()用于在同一位置有许多元素(在列表或树结构中)的情况。然后找到合适的商品,将通过equals()方法进行比较