Метод Node.equals в java.utils.HashMap

Статический класс Node в Hashmap имеет метод equals для сравнения этого объекта Node с объектом Node, переданным в качестве параметра.

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;
    final K key;
    V value;
    Node<K,V> next;

    Node(int hash, K key, V value, Node<K,V> next) {
        this.hash = hash;
        this.key = key;
        this.value = value;
        this.next = next;
    }

    public final K getKey()        { return key; }
    public final V getValue()      { return value; }
    public final String toString() { return key + "=" + value; }

    public final int hashCode() {
        return Objects.hashCode(key) ^ Objects.hashCode(value);
    }

    public final V setValue(V newValue) {
        V oldValue = value;
        value = newValue;
        return oldValue;
    }

    public final boolean equals(Object o) {
        if (o == this)
            return true;
        if (o instanceof Map.Entry) {
            Map.Entry<?,?> e = (Map.Entry<?,?>)o;
            if (Objects.equals(key, e.getKey()) &&
                Objects.equals(value, e.getValue()))
                return true;
        }
        return false;
    }
}

Посмотрите на строку, где объект o назначен новому объекту Map.Entry e. Сравнение ключа и значения можно было бы сделать с самим объектом o. Почему он сначала копируется в объект e, а затем сравнивается? Объект o не изменяется каким-либо образом.

2 ответа

Решение

Линия Map.Entry<?,?> e = (Map.Entry<?,?>)o; не назначается новому объекту Map.Entry, он только приводит o для Entry объект, который будет разрешено использовать getKey() а такжеgetValue()методы, необходимые для сравнения с текущимEntryобъект

Единственные методы, доступные наoподробно здесьjava.lang.Object

Потому что для доступа к методам getKey() а также getValue(), это должно быть приведено к Map.Entry, Это все, что делает эта линия.

Другие вопросы по тегам