当前位置: 首页 > 知识库问答 >
问题:

我需要为inheritedClass和基类定义equals和hashCode方法吗?

羊新翰
2023-03-14

我想知道我是否应该在Product类中定义equalshashCode方法,如下所示?

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);
    }
}

共有3个答案

齐高阳
2023-03-14

让我们假设一个产品的哈希代码是从一个产品特有的属性派生出来的。如果两个对象具有相同的哈希代码,我们还将假设它们相等。在这种情况下:

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值相等,则认为它们是相等的

谢运良
2023-03-14

@费德里科给你正确答案一些细节,

Equals和hashCode是Object类的方法,Object类是所有类的父类。equals和hashCode用于定义特定的类对象与同一类中的其他对象不同,并查找哈希值。(如果您使用它来存储这些对象,则由其他Java集合类调用)。一般来说,如果在父类之上有不同的行为或字段,我们会创建子类。因此,子类应该有更多的字段,以便更好地在子类中实现equals和hashCode。

如果不在子类中实现equals和hashCode,就不会有错误。

巩阳秋
2023-03-14

定义equalshashcode方法调用它们的超级实现是没有用的。完全不定义它们将使用超级实现。在这种情况下,他们将使用hashcode和equals的对象实现(定义它们调用super.equals或super.hashcode,或者根本不定义它们)。

记住,如果需要使用hashcode和equals,就要实现它们。方法equals用于检查两个对象在逻辑上是否是相同的对象,并检查它们的内容。例如,在集合中搜索对象时,可以直接使用,也可以不直接使用。hashcode用于HashMap的键和HashSet的值。

现代ide帮助您根据上下文中有用的字段创建这些方法的正确实现。

 类似资料:
  • 问题内容: 在java中为什么需要覆盖equals和hashcode方法?什么时候用到? 问题答案: 让我们尝试通过一个示例来理解它,如果我们不进行覆盖而覆盖并尝试使用。 假设我们有一个类像这样那样的两个对象是相等的,如果他们等于(和生成) 仅覆盖 如果仅覆盖被覆盖,则在你第一次调用时将散列到某个存储桶,而在调用时将散列到其他存储桶(因为它们具有不同的)。因此,尽管它们是相等的,但由于它们没有散列

  • 问题内容: 如果我有 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 问题答案: 如果我比较A的2个实例但没有覆盖equals方法,是否可以获得预期的结果? 这取决于您的期望:) 默认实现将为您提供 引用相等性-换句话说,当您比较两个引用时,仅当它们是对同一对象的引用时才返回true。 通常,您将重写以实现“值相等”,在这种情况下,两个不同的对象通常被认为具有相等的字段

  • 菜单栏: Code —> Generate —> equals() and hashCode() 右键菜单:Generate —> equals() and hashCode() 快捷键: Mac: command + N Windows\/Linux: Alt + Insert —> equals() and hashCode()

  • 如果你有如下需求,你必须重载 equals() 和 hashCode() 方法: 想把持久类的实例放入 Set 中(当表示多值关联时,推荐这么做),而且 想重用脱管实例 Hibernate 保证,仅在特定会话范围内,持久化标识(数据库的行)和 Java 标识是等价的。因此,一旦我们混合了从不同会话中获取的实例,如果希望 Set 有明确的语义,就必须实现 equals() 和 hashCode()。

  • 问题内容: 决定将这些方法包含在java.lang.Object中的背后原因是什么?平等和哈希对于许多类没有意义。 建立两个接口将更加合乎逻辑: 例如,HashSet定义可能看起来像 这将防止出现一个常见的初学者错误-使用项目集而不实现equals / hashCode。 问题答案: 当我们实现一个接口时,我们注入(或接受)该接口定义的合同。 &是两个不同的合同。但是,如果我们仔细观察,就会发现它

  • 为什么我需要重写Hash Mapp中的值直接访问。也就是说,如果按照下面的hashmap将数据插入到hashmap中,我可以通过将键作为整数来获得值,将对象作为值来获得值。在这种情况下,是否需要重写equals()和hashCode()方法?请给出建议。