我是否需要为 inheritedClass 和 Base Class 定义 equals 和 hashCode 方法?
Do I need to define equals and hashCode methods for inheritedClass and Base Class?
我想知道是否应该在 Product
class 中定义 equals
和 hashCode
方法,如下所示?
public abstract class BaseEntity {
// properties
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object other) {
return super.equals(other);
}
}
public class Product extends BaseEntity {
// properties
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object other) {
return super.equals(other);
}
}
定义 equals
和 hashcode
调用其超级实现的方法没有用。
根本不定义它们将使用 super 实现。
在那种情况下,他们将使用哈希码的 Object
实现,并且在任何一种情况下都等于(定义它们调用 super.equals 或 super.hashCode 或根本不定义它们)。
如果需要使用它们,请记住实现哈希码和等于。方法 equals
用于检查两个对象在逻辑上是否是同一对象,检查它们的内容。例如,当您在集合中搜索对象时,可以直接使用,也可以不直接使用。哈希码用于 HashMap 的键和 HashSet 的值。
现代 ide 可帮助您根据在您的上下文中有用的字段创建这些方法的正确实现。
@federico 为了给你正确的答案一些细节,
equals 和 hashCode 是对象 class 的方法,它是所有 class 的 父级。 equals 和 hashCode 用于定义特定的 class 对象不同于来自相同 class 的其他对象并查找哈希值。(如果您调用其他 Java 集合 classes用它来存储这些对象)。
通常,如果您在父 class 之上有不同的行为或字段,我们会创建子 class。所以,child class 应该有更多的字段,最好在 child class.
中实现 equals 和 hashCode
如果不在子 class 中实现 equals 和 hashCode,将不会出错。
让我们假设产品的哈希码是从产品独有的属性中派生出来的。如果 2 个对象具有相同的哈希码,我们还将假设它们是相等的。在这种情况下:
public abstract class BaseEntity {
public abstract int hashCode();
@Override
public boolean equals(Object object) {
return this.hashCode() == object.hashCode();
}
}
public class Product extends BaseEntity {
@Override
public int hashCode() {
return someValueDerivedFromProductProperties;
}
}
这意味着所有扩展 BaseEntity 的 类 必须定义 hashCode 的实现,并且如果返回的 hashcode 值相等则被认为是相等的
我想知道是否应该在 Product
class 中定义 equals
和 hashCode
方法,如下所示?
public abstract class BaseEntity {
// properties
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object other) {
return super.equals(other);
}
}
public class Product extends BaseEntity {
// properties
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object other) {
return super.equals(other);
}
}
定义 equals
和 hashcode
调用其超级实现的方法没有用。
根本不定义它们将使用 super 实现。
在那种情况下,他们将使用哈希码的 Object
实现,并且在任何一种情况下都等于(定义它们调用 super.equals 或 super.hashCode 或根本不定义它们)。
如果需要使用它们,请记住实现哈希码和等于。方法 equals
用于检查两个对象在逻辑上是否是同一对象,检查它们的内容。例如,当您在集合中搜索对象时,可以直接使用,也可以不直接使用。哈希码用于 HashMap 的键和 HashSet 的值。
现代 ide 可帮助您根据在您的上下文中有用的字段创建这些方法的正确实现。
@federico 为了给你正确的答案一些细节,
equals 和 hashCode 是对象 class 的方法,它是所有 class 的 父级。 equals 和 hashCode 用于定义特定的 class 对象不同于来自相同 class 的其他对象并查找哈希值。(如果您调用其他 Java 集合 classes用它来存储这些对象)。 通常,如果您在父 class 之上有不同的行为或字段,我们会创建子 class。所以,child class 应该有更多的字段,最好在 child class.
中实现 equals 和 hashCode如果不在子 class 中实现 equals 和 hashCode,将不会出错。
让我们假设产品的哈希码是从产品独有的属性中派生出来的。如果 2 个对象具有相同的哈希码,我们还将假设它们是相等的。在这种情况下:
public abstract class BaseEntity {
public abstract int hashCode();
@Override
public boolean equals(Object object) {
return this.hashCode() == object.hashCode();
}
}
public class Product extends BaseEntity {
@Override
public int hashCode() {
return someValueDerivedFromProductProperties;
}
}
这意味着所有扩展 BaseEntity 的 类 必须定义 hashCode 的实现,并且如果返回的 hashcode 值相等则被认为是相等的