使用雇员(id,姓名,指定)对象作为哈希图中的键,我需要覆盖哪种方法

时间:2019-05-07 04:21:59

标签: java

说,我有两个雇员(id,名称,名称)对象e1(1,“ ABC”,“ SE”),e2(2,“ DEF”,“ SSE”)并用作键 hm.put(e1,“ value1”); hm.put(e2,“ value2”); //在id + name + designation的基础上用equals和hashcode方法覆盖的类

假设我像e2对象一样犯了一个错误,我想用“ XYZ”作为名称。 我需要在课堂上进行哪些更改,以便e2与“ value2”具有相同的值

条件:我们无法更改哈希码等于重写的方法。

1 个答案:

答案 0 :(得分:1)

可变键将打破地图状态。因此,干净的方法是删除地图的元素,更改其状态并将其再次放入:

map.remove(e2);
e2.setName("XYZ");
map.put(e2, "...");

这将起作用,但这是一种容易出错的方法,因为在操纵可变员工的任何地方,地图状态损坏都可能发生。
一种更可靠的方法是使员工不可变,以在地图中明确显示removing()然后adding()

Employee e2 = new Employee.Builder().withId(...).withName(...).withDesignation(...).build();
e2.setXXX(...); // it will  not compile as no change state possible now
map.remove(e2);
e2 = e2.copy().withName("XYZ").build();
map.put(e2, "...");

或者使用参数构造函数(对于3个参数仍然可以使用),并且当然不提供设置器:

Employee e2 = new Employee(id, name, designation);
e2.setXXX(...); // it will  not compile as no change state possible now
map.remove(e2);
e2 = new Employee(e2.getId(), "XYZ", e2.getDesignnation());
map.put(e2, "...");