说,我有两个雇员(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”具有相同的值
条件:我们无法更改哈希码等于重写的方法。
答案 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, "...");