我用Employee
和eid
写了一个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
获取它。
请解释这背后的逻辑。
答案 0 :(得分:1)
逻辑是Map
为同一个键提供相同的值。您的e3
与e1
完全相同(来自地图的持久性,因为您已覆盖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
类方法equals
和hashCode
的实现。
您的实施肯定会返回与e3
相同的值,而不是e1
和e2
。
地图会存储Employee
并将其映射到String
。如果您要求e3
,地图会显示,如果已包含e3
,则会根据您使用equals
和hashmap
实施的规则执行此操作。如果它找到一个具有相同值的条目,它将返回它 - 因此我怀疑e1
或e2
与e3
具有相同的值。
如果实施基于'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
)或绝对确定没有人会改变它们(无论如何迟早会发生这种情况...... 。)