Что Java использует, чтобы определить, является ли ключ дубликатом на карте? - PullRequest
12 голосов
/ 13 декабря 2008

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

Ответы [ 5 ]

19 голосов
/ 13 декабря 2008

Интерфейс Map указывает, что если два ключа null, они являются дубликатами, в противном случае, если ключ k такой, что key.equals(k), то существует дубликат. См. Метод содержит или получить здесь:

http://java.sun.com/javase/6/docs/api/java/util/Map.html#containsKey(java.lang.Object)

Однако реализация Map зависит от реализации этой проверки, и HashMap будет использовать хеш-код для сужения потенциальных ключей, которые он проверяет с помощью метода equals. Таким образом, на практике для типичной карты, основанной на хэше, для проверки дубликатов карта использует хеш-код (возможно, некоторого размера) и использует equals для сравнения с любыми ключами, у которых мод хеш-кода одинакового размера дает тот же остаток. 1014 *

3 голосов
/ 13 декабря 2008

Прочитайте вопрос неправильно, но ответ человека выше является правильным, и моя ссылка дает ответ относительно того, как он определяется (метод equals). Посмотрите на содержимое и получить методы в ссылке.

Как карта вставляет: На карте не может быть повторяющегося ключа. Он заменит старое значение новым значением, если вы найдете дубликат ключа. Вот ссылка на интерфейс карты. Кроме того, если вы посмотрите на метод put (ключ K, значение V), он также объясняет, как работает карта. Надеюсь, это поможет.

1 голос
/ 13 декабря 2008

Я предполагаю, что вы имеете в виду java.util.Map, который является интерфейсом, предусмотренным в стандартных библиотеках Java. Метод определения, является ли ключ дубликатом, оставляют на усмотрение конкретной реализации. Например, java.util.HashMap использует equals и hashCode. Вы можете написать свою собственную реализацию Map, которая использует что-то совершенно другое.

0 голосов
/ 13 декабря 2008

Осторожнее на крайнем случае здесь. Нулевые ключи не всегда являются дубликатами. Фактически, нулевые ключи оказываются не в состоянии вызывать большое разочарование между реализациями Map (см. Мой пост Consistency ).

Например, нулевые ключи в порядке в HashMaps, но не в TreeMap, который использует естественное упорядочение, или ConccurentHashMap, где нулевые ключи запрещены. Проблема здесь в том, что они выдают неперехваченные исключения во многих своих методах, если вы используете нулевой ключ, и это приводит к страшным ошибкам времени выполнения при переключении реализаций во время рефакторинга.

0 голосов
/ 13 декабря 2008

Используется метод equals () для ключа. Метод hashCode () просто помогает эффективно хранить ключи для карты.

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