亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法在Java中手動重新哈希映射?

有沒有辦法在Java中手動重新哈希映射?

白豬掌柜的 2023-10-12 16:55:39
我有一個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());

    }


查看完整回答
反對 回復 2023-10-12
  • 1 回答
  • 0 關注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號