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

时间:2011-06-26 16:30:51

标签: java oop hashtable

当我们在哈希表中放置一个类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? 如何解决这个问题?

感谢。

3 个答案:

答案 0 :(得分:7)

所有在哈希类数据结构中用作键的实例的类必须正确实现equalshashCode方法。 Brian Goetz不久前有a great article on this

在不知道CurrPrevNext的结构的情况下,确切示例很难,但假设它们不是空的并且具有合理的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;
}

答案 1 :(得分:6)

最简单的方法是使用Eclipse的生成hashCode()和equals()。您可以选择hashCode和equals计算应考虑哪些成员,因此如果您有一些临时成员(您没有),您只能使用相关的成员。

对于Curr,Prev和Next ......同样(并且递归地)......

答案 2 :(得分:5)

来自java文档:

  

成功存储和检索   来自哈希表的对象,即对象   用作密钥必须实现    hashCode 方法和等于方法。