为什么我可以从具有不同对象的HashMap中检索值?

时间:2014-02-09 16:52:22

标签: java hashmap

我用Employeeeid写了一个ename课程,其中包含了setter和getter,我覆盖了equals()hashcode()

现在我写了另一个类HashMapTest,其中我创建了三个Employee个对象。我将其中两个添加到HashMap,第三个与第一个员工对象相同。

我的HashMapTest类如下:

public class HashMapTest {
    public static void main(String[] args) {
        Employee e1 = new Employee();
        e1.setEid(1);
        e1.setEname("Ganesh");

        Employee e2 = new Employee();
        e2.setEid(1);
        e2.setEname("Mahesh");

        Map<Employee, String> map = new HashMap<Employee, String>();
        map.put(e1, "Software Developer");
        map.put(e2, "Software Test Engineer");

        Employee e3 = new Employee();
        e3.setEid(1);
        e3.setEname("Ganesh");

        System.out.println("Getting employee e3 details " + map.get(e3));
    }
}

我没有将e3添加到HashMap,但我仍然是从HashMap获取它。

请解释这背后的逻辑。

5 个答案:

答案 0 :(得分:1)

逻辑是Map为同一个键提供相同的值。您的e3e1完全相同(来自地图的持久性,因为您已覆盖equals()hashcode()),并且您确实添加了String e1作为地图的关键。

答案 1 :(得分:0)

这取决于你的Employee类中是如何实现equals和hashcode方法的。如果它被实现为考虑具有相同值的对象的对象,当然它将获取

答案 2 :(得分:0)

e3与e1具有相同的字段值。因此,就地图而言,它相当于e1。您正在通过相同的密钥查找它,因此返回您为e1“软件开发人员”添加的值。

答案 3 :(得分:0)

map.get(Object)将根据HashMap.equals()中定义的规则在hashCode()中查找其中存在的对象。因此,它将返回与搜索到的对象相同的对象(在您的情况下为第一个对象)。

答案 4 :(得分:0)

这基本上取决于Employee类方法equalshashCode的实现。

您的实施肯定会返回与e3相同的值,而不是e1e2

地图会存储Employee并将其映射到String。如果您要求e3,地图会显示,如果已包含e3,则会根据您使用equalshashmap实施的规则执行此操作。如果它找到一个具有相同值的条目,它将返回它 - 因此我怀疑e1e2e3具有相同的值。

如果实施基于'eid'和'ename'而不是e1.equals(e3)e1.hashCode() == e3.hashCode(),那么它们可以互换。

警告词:如果您之后改变(更改)值,则使用可变类作为映射中的键可能会导致问题。要试一试,请执行以下操作:

 map.put(e1);
 e1.setEid(3);
 e1.setEname("foo");
 System.out.println(map.contains(e1));   // Will print 'false'

我建议不要这样做,让类不可变(即创建字段final)或绝对确定没有人会改变它们(无论如何迟早会发生这种情况...... 。)