Метод Node.equals в java.utils.HashMap - PullRequest
0 голосов
/ 25 января 2019

Статический класс 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 ]

0 голосов
/ 25 января 2019

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

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

0 голосов
/ 25 января 2019

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

...