代码如下:
public class Main {
public static void main(String[] args) {
Student a = new Student(10, "Ole");
Student b = new Student(10, "Ole");
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
,对象看起来像这样:
public class Student {
private int snr;
private String namn;
public Student(int snr, String namn) {
this.snr = snr;
this.namn = namn;
}
}
这些是运行代码时的结果:
57651960
441366923
我已经阅读了一些javadoc,但我找不到原因,有人可以解释为什么会这样吗?还有什么我必须做的才能使结果相同? (如果可能的话)
感谢您的解释:)!现在有道理;)
答案 0 :(得分:6)
您没有覆盖Object.hashCode()
,因此它会根据对象标识返回值。
尽可能合理实用,由hashCode方法定义 class Object确实为不同的对象返回不同的整数。 (这个 通常通过转换内部地址来实现 将对象转换为整数,但这种实现技术不是 JavaTM编程语言所要求的。)
答案 1 :(得分:2)
Student
类负责提供与equals()合同一致的正确hashCode()方法。来自JavaDoc:
如果两个对象根据
equals(Object)
方法相等,则在两个对象中的每一个上调用hashCode()
方法必须产生相同的整数结果。
这里有完整的例子:
class Student {
private int snr;
private String name;
public Student(int snr, String name) {
this.snr = snr;
this.name = name;
}
@Override public boolean equals(Object obj) {
if (!(obj instanceof Student)) return false;
Student other = (Student) obj;
return Objects.equals(snr, other.snr) && Objects.equals(name, other.name);
}
@Override public int hashCode() {
return Objects.hash(snr, name);
}
}
答案 2 :(得分:1)
你没有覆盖底层Object.Hashcode,你需要这样的东西,你的ide可以为你生成哈希码和等号。
public class Student {
private int snr;
private String namn;
public Student(int snr, String namn) {
this.snr = snr;
this.namn = namn;
}
@override
public int hashcode(){
int result = super.hashCode();
result = 31 * result + (namn!= null ? namn.hashCode() : 0) + snr;
return result;
}
}