为什么没有Object.hashCode()为看似相同的对象返回相同的值

时间:2014-04-28 13:39:06

标签: java object hashcode

代码如下:

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,但我找不到原因,有人可以解释为什么会这样吗?还有什么我必须做的才能使结果相同? (如果可能的话)

感谢您的解释:)!现在有道理;)

3 个答案:

答案 0 :(得分:6)

您没有覆盖Object.hashCode(),因此它会根据对象标识返回值。

来自documentation

  

尽可能合理实用,由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;
  } 
}