Почему переопределение равно не работает для добавления тех же объектов в карте? - PullRequest
1 голос
/ 28 сентября 2019

Если вы посмотрите на эту программу, в классе Location мы переопределяем два метода (equals и hashcode), соответственно возвращая false и 110. Мы создаем один экземпляр класса Location и помещаем в карту два раза.Когда мы возвращаем false из метода equals, почему map перезаписывает последнее значение ключом?

class Location {

        long latitude;
        long longitude;

        public Location(long latitude,int longitude) {
            this.latitude = latitude;
            this.longitude = longitude;
        }

        @Override
        public boolean equals(Object obj) {
            return false;
        }

        @Override
        public int hashCode() {
            return 110;
        }

        @Override
        public String toString() {
            return String.format("Latitude := %d , Longitude :=%d ", latitude,longitude);
        }

    }

    Map<Location, String> locations = new HashMap<>();

    Location l1 = new Location(2,3); 
    locations.put(l1, "Mumbai");
    locations.put(l1,"Pune");       

    System.out.println(locations+ " with size of :"+locations.size());

1 Ответ

0 голосов
/ 28 сентября 2019

Я посмотрел в HashMap реализации.Очевидно, ваш Location::equals никогда не вызывается, потому что == используется для проверки равенства ключей.И причина этого - благодаря chrylis - вы дважды добавляете идентичное местоположение.
Измените свой код:

Location l1 = new Location( 2, 3 );
locations.put( l1, "Mumbai" );

Location l2 = new Location( 2, 3 );
locations.put( l2, "Pune" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...