在java中为什么需要覆盖equals和hashcode方法?

在java中为什么需要覆盖equals和hashcode方法?什么时候用到?

回答:

让我们尝试通过一个示例来理解它,如果我们equals()不进行覆盖而覆盖hashCode()并尝试使用Map

假设我们有一个类像这样那样的两个对象MyClass是相等的,如果他们importantField等于(与hashCode()equals()Eclipse生成)

public class MyClass {

private final String importantField;

private final String anotherField;

public MyClass(final String equalField, final String anotherField) {

this.importantField = equalField;

this.anotherField = anotherField;

}

public String getEqualField() {

return importantField;

}

public String getAnotherField() {

return anotherField;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result

+ ((importantField == null) ? 0 : importantField.hashCode());

return result;

}

@Override

public boolean equals(final Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

final MyClass other = (MyClass) obj;

if (importantField == null) {

if (other.importantField != null)

return false;

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

return false;

return true;

}

}

仅覆盖 equals

如果仅equals覆盖被覆盖,则在你myMap.put(first,someValue)第一次调用时将散列到某个存储桶,而在调用myMap.put(second,someOtherValue)时将散列到其他存储桶(因为它们具有不同的hashCode)。因此,尽管它们是相等的,但由于它们没有散列到同一个存储桶中,因此地图无法实现,因此它们都留在了地图中。

尽管equals()如果我们要覆盖,则不必覆盖hashCode(),但让我们看看在这种特殊情况下会发生什么,在这种情况下,我们知道如果两个对象MyClass相等,则它们importantField相等但我们不覆盖equals()

仅覆盖 hashCode

想象你有这个

MyClass first = new MyClass("a","first");

MyClass second = new MyClass("a","second");

如果仅覆盖,hashCode则在调用myMap.put(first,someValue)它时会先进行计算,hashCode然后将其计算并存储在给定存储桶中。然后,在调用时myMap.put(second,someOtherValue),应根据地图文档将其替换为第二,因为它们相等(根据业务要求)。

但问题是,等于没有重新定义,所以当图哈希second通过桶和迭代,查找是否有一个对象k,从而second.equals(k)是事实,就不会找到任何的second.equals(first)false。

以上是 在java中为什么需要覆盖equals和hashcode方法? 的全部内容, 来源链接: utcz.com/qa/417163.html

回到顶部