使用对象的实例作为哈希映射键



我也发现了类似的问题,但是它们都没有真正帮助我(这可能意味着我做错了什么,这就是为什么我在这里)。

我有一个hashmap Map<Integer, List<Book>>,应该将StudentID作为密钥,而他拥有的Book列表作为价值。尽管仅将ID作为钥匙起作用,但我觉得它不是一种面向对象的方法,我应该将Student用作钥匙(因此看起来像是这样:Map<Student, List<Book>>)。我尝试使用它,但是当我尝试返回给定的StudentBook列表时,我遇到了很多错误,这很可能是因为找不到Student。我的教授向我建议@Override Java的hashCodeequals方法,这是有道理的,因为这是HashMap比较键的方式,但我在此方面没有成功(我不确定我需要比较什么才能查看两个Student是否需要进行比较。是一样的;据说仅它们的ID就应该起作用)。这是覆盖方法:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Student other = (Student) obj;
    if (id != other.id)
        return false;
    return true;
}

我在做什么错?您可以省去的任何灯都会非常有帮助。预先感谢!

,如果您的id在整数缓存范围内具有值,即-128-127-127

,该错误似乎是在您的equals方法中
 if (id != other.id) // <-- Error
        return false;

从您的示例中,ID似乎是Integer对象

==检查参考是否相等,即它们是否指向同一对象。

对于原始类型,==检查值是否相等。

java.lang.integer是一种参考类型。int是一种原始类型。

尽管在整数中,==仅适用于-128之间的数字 127作为JVM缓存这些值

您需要将其更改为

if (!id.equals(other.id))
            return false;

最新更新