HashMap с ключом объекта - PullRequest
0 голосов
/ 12 июня 2019

Я создал HashMap с объектом в качестве ключа и строкой в ​​качестве значения.Я сталкиваюсь с проблемой, когда я назначаю новый Объект с тем же номером счета (который является уникальным ключом), и я не вставил в свой HashMap, и если я его получаю, вместо нулевого возвращается старое значение.Я новичок в 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 голосов
/ 12 июня 2019

Любая разумная реализация Map (не только HashMap) даст вам такой результат.A Map хранит пары ключей и значения.Когда вы get получаете значение для ключа, он смотрит, равен ли один из сохраненных ключей заданным ключам, и дает вам соответствующее значение.Согласно вашему определению Map, a1 и a3 равны.Поэтому, когда вы делаете map.get(a3), вы получаете значение a3.

Кроме того, не рекомендуется обновлять ключ после его использования в Map.Хотя здесь это не является реальной проблемой, это может привести к непредсказуемым результатам, если вы обновите поля, используемые в методах hashCode и equals.

Что вы хорошо сделали: вы переопределили equalsи hashCode последовательно.

0 голосов
/ 12 июня 2019

Это не приводит к вашим ожиданиям, потому что, переопределенный метод equals ищет имя владельца для проверки.

попробуйте с методом ниже,

 @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/

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...