我有一個Employee具有兩個屬性的類。public class Employee { private int empId; private String empName; public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Employee)) return false; Employee employee = (Employee) o; return getEmpId() == employee.getEmpId() && Objects.equals(getEmpName(), employee.getEmpName()); //return Objects.equals(getEmpName(), employee.getEmpName()); } @Override public int hashCode() { //return Objects.hash(getEmpId()); return Objects.hash(getEmpId(), getEmpName()); }}我使用此類作為 Hashmap 中的鍵?,F在,當我修改原始對象(emp在這種情況下更改員工對象的名稱)時,我無法訪問最初保存在地圖中的條目。只有當我將名稱回滾到原始值時,我才能再次訪問該對象。這表明,當我更改 Employee 對象中的名稱時,它的哈希值已更改,并且未存儲在 Hashmap 中的正確存儲桶下。Map<Employee, String> map = new HashMap<>();; // Set Employee with Name Shashi Employee emp = new Employee(); emp.setEmpId(1); emp.setEmpName("Shashi"); // Add to Map map.put(emp, emp.getEmpName()); // Modify The Original Employee object's Name emp.setEmpName("Shashi Bhushan"); // This object does not exist as key in map now Assert.assertFalse(map.containsKey(emp)); // Create object with same name(used when creating) Employee similarEmployee = new Employee(); similarEmployee.setEmpId(1); similarEmployee.setEmpName("Shashi");解決能夠在映射中獲取對象的問題的一種解決方案是使 Employee 類不可變。我能想到的另一個理論解決方案是重新散列映射并將修改后的員工對象保留在映射中正確的存儲桶中,但我在散列映射中看不到任何重新散列它的方法。請建議我是否朝著正確的方向思考,或者是否有其他解決方案。PS這一切都是為了理解hashmap,所以對于如何解決這個問題沒有限制。
1 回答

FFIVE
TA貢獻1797條經驗 獲得超6個贊
我認為empId可以唯一標識一個員工。
soequals和hashCode方法只需要處理empId字段:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Employee)) return false;
Employee employee = (Employee) o;
return getEmpId() == employee.getEmpId());
}
@Override
public int hashCode() {
return Objects.hash(getEmpId());
}
添加回答
舉報
0/150
提交
取消