使用key作为Generic Type对象的HashMap在containsKey中返回false

时间:2017-08-14 19:33:09

标签: java

我有以下通用类,它正确实现了equals和hashcode方法

class Node<T> {
private T data;
private Node<T> previous;
private Node<T> next;

public Node(T data) {
    if (data != null) {
        this.data = data;
    } else {
        throw new RuntimeException("Null not allowed");
    }
}

public T getData() {
    return data;
}

public Node<T> getPrevious() {
    return previous;
}

public void setPrevious(Node<T> previous) {
    this.previous = previous;
}

public Node<T> getNext() {
    return next;
}

public void setNext(Node<T> next) {
    this.next = next;
}

public int hashCode() {
    return data.hashCode();
}

public boolean equals(Node<T> that) {
    return this.data.equals(that.getData());
}}

此Node对象用作HashMap中的键,用于保持计数,其周围的类是不同的泛型类型。

class Struct<T> {
    private Map<Node<T>, Integer> counter = new HashMap<>();
    public boolean contains(Node<T> val) {
         return counter.containsKey(val);
    }
    public void add(Node<T> val) {
        if (contains(val)) {
             int count = counter.get(val);
             counter.put(val, ++count);
        } else {
             counter.put(val, 1);
        }
    }
}

这是从我的主要方法调用的

Struct<String> str = new Struct<String>();
str.add(new Node<String>("test1"));
System.out.println(str.contains(new Node<String>("test1")));

即使hashCode匹配,println也会输出false。不确定我在理解流程时到底出错了。我尝试使用hashCode和equals上的记录器来调试代码。但是每当我调用包含键时,hashCode会被调用,它会打印相同的哈希码但是从不调用equals方法。因此,我认为这不是链接问题的重复。

更新 Node的equals方法改为以下,就像魅力一样。

public boolean equals(Object that) {
    if (that == null) return false;
    if (that == this) return true;
    if (!(that instanceof Node))return false;
    Node thatVal = (Node) that;
    return this.data.equals(thatVal.getData());
}

0 个答案:

没有答案