当前位置: 首页 > 面试题库 >

如果hashtable中的key是一个类对象,containsKey如何工作?

淳于凯
2023-03-14
问题内容

当我们将一个类对象(具有三个数据成员)放在哈希表中时,如何防止将另一个项放入具有相同的三个数据成员的键的哈希表中?Cos,我猜这将是一个新对象。因此,即使有一个键(此类对象)的数据成员与等待插入的键具有完全相同的键,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?如何解决此问题?

谢谢。


问题答案:

在具有类似散列的数据结构中将实例用作键的所有类,都 必须 正确实现equalsand hashCode方法。Brian Goetz
从前有一篇很棒的文章。

如果不知道的结构CurrPrev以及Next和详细的例子是困难的,但假设它们不为空,并有合理的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;
}


 类似资料:
  • 本文向大家介绍如果hashMap的key是一个自定义的类,怎么办?相关面试题,主要包含被问及如果hashMap的key是一个自定义的类,怎么办?时的应答技巧和注意事项,需要的朋友参考一下 考点:集合 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。

  • 本文向大家介绍如何判断出一个js对象是否一个dom对象,包括了如何判断出一个js对象是否一个dom对象的使用技巧和注意事项,需要的朋友参考一下 我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法。 要判断一个对象是否DOM对象,首先想到的无非就是它是否具有DOM对象的各种属性或特征,比如是否有nodeType属性

  • 我只是想知道类(Oracle提供的rt.jar内部)如java.lang.Object、java.lang.String是如何从.java源文件生成的。我认为,他们的javac不可能编译它们。 我尝试编译包含“类Dummy{}”的Dummy.java [解析已启动RegularFileObject[dummy.java]] [解析完成12毫秒] [源文件的搜索路径:.]

  • 问题内容: 我正在玩Java的反射API,并尝试处理一些字段。现在,我要确定字段的类型。字符串很简单,只需执行即可。其他非派生类也是如此。但是,如何检查派生类?例如作为的子类。我无法找到任何或方法。我是否需要遍历所有人并自己找到超人? 问题答案: 您需要此方法: 一般情况下,(以上)应替换为并应替换为 从JavaDoc: 确定此对象表示的类或接口是否与指定参数表示的类或接口相同或超类或超接口。如果

  • 无论是ES6promise还是蓝鸟promise、Qpromise等。 如何测试给定对象是否为Promise?

  • 请考虑以下代码: 在foo中,的类型将是。 我想在中创建一个变量,它的类型是的泛型,在本例中是。 有没有办法做到这一点?谢谢。 编辑不幸的是(我想)我无法重写签名,因为函数是用不同类型的对象调用的,例如