Реализация содержит ключ HashMap <> - Java - PullRequest
0 голосов
/ 14 сентября 2011

Целью использования containsKey () является проверка того, находится ли какой-либо ключ в HashMap или нет?Если он не содержит этот ключ, тогда просто добавьте ключ в этот HasMap.

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

Потенциальное решение:

Одним из решений может быть получение уникальных данных из этого объекта1 (oldKey) и проверка с помощьюobject2 (новый ключ), если они одинаковы, не используйте его в HashMap.Однако это означает, что содержит ключ не имеет никакой цели.Я прав?

Извините, я не ругаю, или, возможно, я звучу так.Но я хотел бы знать, как наиболее эффективно решить эту проблему.

будет благодарен за любую помощь.

Ответы [ 4 ]

5 голосов
/ 14 сентября 2011

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

Неправильно.Их равенство проверяется путем сравнения их hashCode() значений в первую очередь.Только если значения хеш-функции равны, сами объекты могут сравниваться (но всегда с использованием equals(), а не ==).Таким образом, любой класс, в котором эти два метода реализованы правильно, будет работать как ключ в HashMap.

2 голосов
/ 14 сентября 2011

HashMap.containsKey() метод определяет, существует ли ключ hashCode(), а не путем сравнения на равенство.Если хеш-код существует, он извлечет запись, чтобы увидеть, равно ли равенство ссылки ИЛИ equals() ключа.

Это реализовано в методе HashMap.getEntry():

/**
     * Returns the entry associated with the specified key in the
     * HashMap.  Returns null if the HashMap contains no mapping
     * for the key.
     */
    final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }
1 голос
/ 14 сентября 2011

Но, похоже, когда мы вызываем этот метод, его параметры имеют тип объекта

Да, но метод будет вызываться для фактического типа реализации, а не для Object.class.Вот почему так важно правильно реализовать hashCode ().

Чтение: Эффективная Java, Item 9 (на самом деле вы должны купить и прочитать всю книгу)

0 голосов
/ 14 сентября 2011

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

Этот вывод неверен.containskey(Object key) вызывает метод equals() для переданного ключа, поэтому, если он переопределил метод equals(Object key), он будет корректно разрешен на основе критериев эквивалентности ключа.Конечно, если ключ не переопределил метод equals(), то начинать с этого плохого плана.

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