Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用对象';s实例作为HashMap键_Java_Hashmap_Equals_Hashcode - Fatal编程技术网

Java 使用对象';s实例作为HashMap键

Java 使用对象';s实例作为HashMap键,java,hashmap,equals,hashcode,Java,Hashmap,Equals,Hashcode,我发现了类似的问题,但到目前为止,没有一个真正帮助过我(这可能意味着我做错了什么,这就是为什么我会在这里) 我有一个HashMapMap,它应该有一个学生的ID作为键,他拥有的书的列表作为值。虽然只将ID作为键传递,但我觉得这不是一种足够面向对象的方法,我应该使用Student作为键(因此看起来是这样的:Map)。我试图使用它,但当我试图返回一个给定的学生的书籍列表时,出现了一系列错误,很可能是因为找不到学生的。我的教授建议我重写Java的hashCode和equals方法,这很有意义,因为这就

我发现了类似的问题,但到目前为止,没有一个真正帮助过我(这可能意味着我做错了什么,这就是为什么我会在这里)

我有一个HashMap
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;