==运算符在Java检查内存地址中的作用

直到今天,我还相信具有相同哈希码的两个对象意味着它们都具有相同的内存位置。但下面的一段代码完全讲述了一个不同的故事:


学生实体:公共类学生实现 Comparable {


int id;

int marks;

String Subject;


public int getId() {

    return id;

}

public void setId(int id) {

    this.id = id;

}

public int getMarks() {

    return marks;

}

public void setMarks(int marks) {

    this.marks = marks;

}

public String getSubjects() {

    return Subject;

}

public void setSubject(String subject) {

    Subject = subject;

}


public Student() {


}

public Student(int id, String subject, int marks) {

    super();

    this.id = id;

    this.marks = marks;

    Subject = subject;

}

@Override

public int compareTo(Student o) {

    if (this.getId()>(o.getId()))

    return 1;


    if (this.getId()<(o.getId()))

    return -1;


    return 1;

}


    @Override

    public int hashCode() {

        final int prime = 31;

        int result = 1;

        result = prime * result + ((Subject == null) ? 0 : Subject.hashCode());

        result = prime * result + id;

        result = prime * result + marks;

        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 (Subject == null) {

            if (other.Subject != null)

                return false;

        } else if (!Subject.equals(other.Subject))

            return false;

        if (id != other.id)

            return false;

        if (marks != other.marks)

            return false;

        return true;

    }



}


米琪卡哇伊
浏览 97回答 3
3回答

长风秋雁

好吧,hashCode()总是返回内存地址并不完全正确。在您的特定情况下,您正在覆盖该函数以基本上返回Subject引用的 hashCode。您的评估显示以下输出:stringops.Student@955a0720这可能有点令人困惑,因为这实际上不是裸内存地址,而是对toString()对象方法的调用。看看Java是如何实现的&nbsp;toString:getClass().getName()&nbsp;+&nbsp;'@'&nbsp;+&nbsp;Integer.toHexString(hashCode())所以,事实上,这两个对象有不同的内存位置,但是因为你覆盖hashCode()你不会看到它们。此外,没有办法覆盖 Java 如何选择对象的内存地址(可能除了一些 hack),但是,两个对象不能具有相同的地址。下次请包含更多文本而不是屏幕截图,以提高其他人对您的问题的搜索能力。

Helenr

您刚刚正确地确定了两个不同的对象——即不在同一内存地址的两个对象——确实可以具有相同的哈希码。规则是,如果两个对象通过该.equals()方法相等,那么它们应该产生相同的哈希码。除了这个和“不同的对象应该尝试有不同的哈希码”的一般想法之外,没有要求不同位置的对象应该有不同的哈希值。不过,这是一件好事。例如,String每个具有相同字符序列的两个不同对象应该直观地具有相同的哈希码,以便HashMap<String, T>可以正确查找字符串。这样,提供与String用作键的对象不同但具有相同逻辑值的对象将正常工作;所有String具有相同字符序列的 s 散列到同一个位置。

温温酱

hashcode 是一个 int 值,由 hascode() 方法返回。Object.java 定义了 hascode() 并且每个 java 类都是 Object.java 的子类,因此每个类都继承它。如果他/她希望覆盖它,则取决于特定类的开发人员。类的开发人员可能会选择(尽管是一种不好的做法)为类的所有对象重新运行相同的常量 int 值。通常 hascode 取决于对象的一个或多个属性的值。即使开发人员可能会尽力返回唯一的哈希码,但仍然(哈希码冲突)两个不同的对象最终可能会得到相同的哈希码。一次只能将一个内存位置分配给一个对象。两个不同对象的哈希码(位于内存中的两个不同地址)可能相同也可能不同还有一个相关的概念:equals 和 hascode 方法的合同。它表示如果两个对象通过调用 equals 返回 true,则两个对象必须具有相同的哈希码。请注意,这是定义的合同,但由开发人员开发类并编写哈希码方法以遵守合同。一个糟糕的实现可能会导致两个对象返回不同的hascode,对于equals方法返回true。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java