Hashmap с двумя ключевыми объектами, имеющими одно и то же значение, но с другим индексом сегмента - PullRequest
0 голосов
/ 20 марта 2019

Если Hashmap имеет два ключа с одинаковым значением, например:

HashMap map=new HashMap();
map.put("a","abc");
map.put("a","xyz");   

Итак, поставьте два ключа со значением "a" и предположим, что для первого bucketindex = 1 и второй индекс ведра = 9

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

Ответы [ 4 ]

2 голосов
/ 20 марта 2019

Не будет такой вещи, как «индекс второго сегмента».

Я предлагаю вам добавить что-то вроде System.out.println(map.toString()), чтобы увидеть, что этот второй пут () сделал с вашей картой.

РЕДАКТИРОВАНИЕ:

В методе put(key,value) "индекс корзины" вычисляется как функция значения элемента key, а не значения элемента value (т. Е. "A"и «а» дают тот же индекс для ведра).Предполагается, что эта функция является детерминированной, поэтому, передавая ей одно и то же значение («a» в вашем случае), выдается тот же hashCode () и впоследствии тот же индекс сегмента.

1 голос
/ 20 марта 2019

Чтобы сделать ответ @ Эрвина более понятным, вот исходный код HashMap из JDK

public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

Если углубиться, вы обнаружите, что индекс сегмента вычисляется из хеш-кода key.

Чтобы сделать его простым и понятным, при установке дубликата ключа с разными значениями на один и тот же HashMap будет получена только одна запись, а вторая позиция просто перезаписывает значение записи.

1 голос
/ 20 марта 2019

В Java, если хеш-функция возвращает тот же хеш, равенство двух объектов определяется методом equals(). И если объекты оказываются равными, старый просто заменяется новым.

Вместо этого, если объекты не равны, они просто объединяются в связанный список (или сбалансированное дерево), и карта содержит оба объекта, , потому что они отличаются .

Итак, вернемся к вашему вопросу: «если индекс корзины для обоих изменится после применения алгоритма хеширования» - это невозможно для одинаковых объектов. Равные объекты должны иметь одинаковый хэш-код.

0 голосов
/ 20 марта 2019

Если ваш вопрос заключается в том, как создать хеш-карту, которая может обрабатывать более одного значения для одного и того же ключа, вам понадобится карта>, так что он добавляет новое значение в массив массивов каждый раз, когда ключ один и тот же.

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