java – 如果哈希表中的键是一个类对象,那么containsKey是如何工作的?

当我们在哈希表中放置一个类Object(有三个数据成员)时,如何防止将另一个条目放入其密钥具有相同三个数据成员的哈希表中?我猜这将是一个新的对象.因此hashtable.containsKey()将返回false,即使有一个键(此类对象)具有与等待插入的数据成员完全相同的数据成员.

更清楚:
我有一个类似的课程

class Triplet {
private Curr curr;
private Prev prev;
private Next next;
}

我有一个哈希表结构,如:

Hashtable<Triplet, Integer> table = new Hashtable<Triplet, Integer>();

当我做:

if(!table.containsKey(triplet_to_inserted))
table.put(triplet, new Integer(0));

即使表中包含已具有相同数据成员的三元组,这是否会插入副本?即:triplet_to_be_inserted.curr,triplet_to_be_inserted.next和triplet_to_be_inserted.prev
如果是,如何防止这种情况?

此外,对于要插入的任何条目,containsKey()是否会返回true?
如何解决这个问题?

谢谢.

最佳答案
所有具有在类哈希数据结构中用作键的实例的类必须正确实现equals和hashCode方法. Brian Goetz有一段时间有a great article on this.

在不知道Curr,Prev和Next的结构的情况下,确切的示例很难,但假设它们不是null并且具有合理的hashCode实现,那么您可以执行以下操作:

public boolean equals(Object obj) {
    if (!(obj instanceof Triplet)) {
        return false;
    } else {
        Triplet that = (Triplet)obj;
        return this.curr.equals(that.curr) &&
            this.next.equals(that.next) &&
            this.prev.equals(that.prev);
    }
}

public int hashCode() {
    int hash = this.curr.hashCode();
    hash = hash * 31 + this.next.hashCode();
    hash = hash * 31 + this.prev.hashCode();
    return hash;
}

转载注明原文:java – 如果哈希表中的键是一个类对象,那么containsKey是如何工作的? - 代码日志