Java 使用对象';s实例作为HashMap键
我发现了类似的问题,但到目前为止,没有一个真正帮助过我(这可能意味着我做错了什么,这就是为什么我会在这里) 我有一个HashMapJava 使用对象';s实例作为HashMap键,java,hashmap,equals,hashcode,Java,Hashmap,Equals,Hashcode,我发现了类似的问题,但到目前为止,没有一个真正帮助过我(这可能意味着我做错了什么,这就是为什么我会在这里) 我有一个HashMapMap,它应该有一个学生的ID作为键,他拥有的书的列表作为值。虽然只将ID作为键传递,但我觉得这不是一种足够面向对象的方法,我应该使用Student作为键(因此看起来是这样的:Map)。我试图使用它,但当我试图返回一个给定的学生的书籍列表时,出现了一系列错误,很可能是因为找不到学生的。我的教授建议我重写Java的hashCode和equals方法,这很有意义,因为这就
Map
,它应该有一个学生的ID
作为键,他拥有的书的列表作为值。虽然只将ID
作为键传递,但我觉得这不是一种足够面向对象的方法,我应该使用Student
作为键(因此看起来是这样的:Map
)。我试图使用它,但当我试图返回一个给定的学生的书籍列表时,出现了一系列错误,很可能是因为找不到学生的。我的教授建议我重写Java的hashCode
和equals
方法,这很有意义,因为这就是HashMap
比较键的方式,但我在这方面没有成功(我不确定我需要比较什么才能确定两个学生是否相同;据推测,他们的ID
应该单独起作用)。以下是覆盖的方法:
@覆盖
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果+id;
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
学生其他=(学生)obj;
if(id!=其他.id)
返回false;
返回true;
}
我做错了什么?如果您的id
的值超出整数缓存范围,即-128-127,那么您能提供的任何信息都将非常有用。请提前感谢!错误似乎出现在您的equals
方法中
if (id != other.id) // <-- Error
return false;
错误在其他地方。请发布一个完整的最小示例来重现问题。if(id!=other.id)返回false;return true;
为什么您更喜欢这个而不是return id.equals(other.id);
?可能,但由于这些方法看起来像是自动生成的方法,我猜id是一个原语。由于OP在映射中使用了一个整数作为键,使我相信id是一个整数实例,如果(!id.equals(other.id))返回false;
为什么您更喜欢这个返回id.equals(other.id);
?@LewBloch目前可以很好地工作,但只要在equals方法中添加更多字段进行比较,就必须更改语句return id.equals(other.id);否则,将不会执行剩余的比较语句。因此,从代码扩展性的角度来看,正确的形式更好。这里的情况不是这样的,但是我们可以说,与非面向对象的id
相比,我们使用三个名称部分,我们可以只使用:boolean is=first.equals(other.first)&&second.equals(other.second)和&third.equals(other.third);
我同意有时如果链更好,但是很少值类型的相等比较涉及三个以上的字段。
if (!id.equals(other.id))
return false;