我也发现了类似的问题,但是它们都没有真正帮助我(这可能意味着我做错了什么,这就是为什么我在这里)。
我有一个hashmap Map<Integer, List<Book>>
,应该将Student
的ID
作为密钥,而他拥有的Book
列表作为价值。尽管仅将ID
作为钥匙起作用,但我觉得它不是一种面向对象的方法,我应该将Student
用作钥匙(因此看起来像是这样:Map<Student, List<Book>>
)。我尝试使用它,但是当我尝试返回给定的Student
的Book
列表时,我遇到了很多错误,这很可能是因为找不到Student
。我的教授向我建议@Override
Java的hashCode
和equals
方法,这是有道理的,因为这是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;