具有对象键的HashMap

时间:2019-06-12 03:38:14

标签: java collections hashmap

我创建了一个HashMap,其对象为键,字符串为值。当我分配一个具有相同帐号(这是唯一键)的新对象并且没有插入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;
        }
    }

期望-map.get(a3)应该为null

2 个答案:

答案 0 :(得分:0)

这不会引起您的期望,因为,“等于方法”的重载将寻求持有人的姓名进行测试。

尝试以下方法,

 @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);
    }

在覆盖哈希码和equals方法时,需要注意某些要点。您可以在https://www.mkyong.com/java/java-how-to-overrides-equals-and-hashcode/

上阅读更多内容

希望这会对您有所帮助。

答案 1 :(得分:0)

任何合理的Map实现(不仅是HashMap)都会为您带来这一结果。 Map存储密钥对值。当您get的键值时,它将查看存储的键之一是否等于给定的键,并为您提供相应的值。根据您对Map的定义,a1a3相等。因此,当您执行map.get(a3)时,将获得a3的值。

除此之外,在Map中使用密钥后更新密钥不是一个好主意。尽管这不是一个真正的问题,但是如果您更新方法hashCodeequals中使用的字段,它可能会产生不可预测的结果。

您做得很好:您始终覆盖equalshashCode