我有以下通用类,它正确实现了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());
}