Интервью Вопрос по хэш-коду Java () - PullRequest
8 голосов
/ 14 июля 2011

Я недавно посетил интервью и мне задали следующий вопрос.

Есть два объекта с одинаковым хэш-кодом.Я вставляю эти два объекта в хеш-карту.

hMap.put(a,a); hMap.put(b,b);

где a.hashCode()==b.hashCode()

Теперь скажите мне, сколько объектов будет в хеш-карте?

Я ответил, что будет только один объект, так как хеш-коды равны, два объекта будут равны, и хеш-карта не позволит дублировать ключи.Скажите, пожалуйста, правильно ли мое понимание или нет?

Ответы [ 5 ]

32 голосов
/ 14 июля 2011

Может быть два разных элемента с одинаковым хеш-кодом.Так что ваш ответ неверен.Гарантируется только то, что если два элемента имеют разные хэш-коды, то они разные.Когда два элемента имеют одинаковый хэш-код, тогда Java использует равенства для дальнейшей разности.

Таким образом, ответом является один или два объекта.

3 голосов
/ 14 июля 2011

В хэш-карте будет один или два объекта.

Если два объекта не равны, т.е. !a.equals(b), оба будут сохранены.

2 голосов
/ 14 июля 2011

Нет, hashCode - это начальный поиск эффективности, но если a.equals(b)==true будет две записи

1 голос
/ 14 июля 2011

В хэш-карте будет два объекта, потому что они не equals().

Вот доказательство:

public static void main(String[] args) {
    Object a = new Object() {
        public int hashCode() {
            return 1;
        }
    };

    Object b = new Object() {
        public int hashCode() {
            return 1;
        }
    };

    Map<Object, Object> map = new HashMap<Object, Object>();
    map.put(a, a);
    map.put(b, b);
    System.out.println(map.size());
}

Вывод:

2

Если я добавлю метод equals () следующим образом:

        public boolean equals(Object obj) {
            return obj.hashCode() == hashCode();
        }

Вывод:

1

В соответствии с javadoc для Object.equals () :

Обратите внимание, что обычно необходимо переопределять метод hashCode всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт для метода hashCode, в котором говорится, что равные объекты должны иметь одинаковые хеш-коды.

Это не , однако означает, что два объекта, которые не equals(), не могут использовать один и тот же хэш-код.

0 голосов
/ 15 июля 2011

Существует один или два ключевых объекта в зависимости от a.equals (b), и один или два объекта значения в зависимости от a == b.

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