簡體   English   中英

帶對象鍵的HashMap

[英]HashMap with Object Key

我創建了一個HashMap其中Object為Key,String為Value。 當我分配一個具有相同帳號的新對象(這是唯一鍵)並且我沒有插入我的HashMap ,我遇到問題,如果我得到它,則返回舊值而不是null。 我是Java HashMap內部工作的新手。

class Main {
      public static void main(String[] args) {
           HashMap<Account, String> map = new HashMap<Account, String>();  
            Account a1 = new Account(1);
            a1.setHolderName("A_ONE");
           Account a2 = new Account(2);
            a2.setHolderName("A_TWO");
            map.put(a1, a1.getHolderName());
            map.put(a2, a2.getHolderName());
            a1.setHolderName("Defaulter");
            a2.setHolderName("Bankrupt");
            System.out.println(map.get(a1)); //Prints A_ONE
            System.out.println(map.get(a2)); //Prints A_TWO
            Account a3 = new Account(1);
            a3.setHolderName("A_THREE");
            System.out.println(map.get(a3)); //Prints value of a1 ??? WHY SO
      }
    }

    public class Account
    {
        private int accountNumber;
        private String holderName;

        public Account(int accountNumber) {
            this.accountNumber = accountNumber;
        }

        public String getHolderName() {
            return holderName;
        }

        public void setHolderName(String holderName) {
            this.holderName = holderName;
        }

        public int getAccountNumber() {
            return accountNumber;
        }

        //Depends only on account number
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 13;
            result = prime * result + accountNumber; 
            return result;
        }

        //Compare only account numbers
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Account other = (Account) obj;
            if (accountNumber != other.accountNumber)
                return false;
            return true;
        }
    }

Expectation- map.get(a3)應該為null

它不會導致你的期望,因為,等於方法的重寫尋求持有者名稱來測試。

試試下面的方法,

 @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof Account)) {
            return false;
        }
        Account user = (Account) o;
        return user.accountNumber == accountNumber &&                   
                user.holderName.equals(holderName);
    }

在覆蓋哈希碼和等於方法時,您需要注意某些點。 您可以在https://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/上閱讀更多內容。

希望這會幫助你。

Map任何合理實現(不僅僅是HashMap )都會給你這個結果。 Map存儲成對的鍵值。 當您get某個鍵的值時,它會查看其中一個存儲的鍵是否等於給定的鍵並為您提供相應的值。 根據你對Map的定義, a1a3是相等的。 因此,當你執行map.get(a3)你會得到a3的值。

除此之外,在Map使用它后更新密鑰並不是一個好主意。 雖然這不是一個真正的問題,但是如果更新方法hashCodeequals中使用的字段,它可能會產生不可預測的結果。

你做得很好:你已經一直覆蓋了equalshashCode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM