当前位置: 首页 > 面试题库 >

在子类中覆盖equals()和hashCode()……考虑到超级字段

皇甫聪
2023-03-14
问题内容

关于如何考虑 超字段的 子类中的 Override
equals()hashCode()in,是否有特定规则?知道有很多参数:超字段是private / public,有/没有getter …

例如,Netbeans生成的equals()和hashCode()不会考虑超级字段…和

    new HomoSapiens("M", "80", "1.80", "Cammeron", "VeryHot").equals(
    new HomoSapiens("F", "50", "1.50", "Cammeron", "VeryHot"))

将返回true :(

public class Hominidae {

    public String  gender;
    public String  weight;
    public String  height;

    public Hominidae(String gender, String weight, String height) {
        this.gender = gender;
        this.weight = weight;
        this.height = height;
    }
    ... 
}

public class HomoSapiens extends Hominidae {
    public String name;
    public String faceBookNickname;

    public HomoSapiens(String gender, String weight, String height, 
                       String name, String facebookId) {
        super(gender, weight, height);
        this.name = name;
        this.faceBookNickname = facebookId;
    }
    ...  
}

如果要查看Netbeans生成的equals()和hashCode():

public class Hominidae {

    ...

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Hominidae other = (Hominidae) obj;
        if ((this.gender == null) ? (other.gender != null) : !this.gender.equals(other.gender)) {
            return false;
        }
        if ((this.weight == null) ? (other.weight != null) : !this.weight.equals(other.weight)) {
            return false;
        }
        if ((this.height == null) ? (other.height != null) : !this.height.equals(other.height)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 37 * hash + (this.gender != null ? this.gender.hashCode() : 0);
        hash = 37 * hash + (this.weight != null ? this.weight.hashCode() : 0);
        hash = 37 * hash + (this.height != null ? this.height.hashCode() : 0);
        return hash;
    }

}


public class HomoSapiens extends Hominidae {

    ...

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final HomoSapiens other = (HomoSapiens) obj;
        if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
            return false;
        }
        if ((this.faceBookNickname == null) ? (other.faceBookNickname != null) : !this.faceBookNickname.equals(other.faceBookNickname)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + (this.name != null ? this.name.hashCode() : 0);
        hash = 89 * hash + (this.faceBookNickname != null ? this.faceBookNickname.hashCode() : 0);
        return hash;
    }
}

问题答案:

儿童不应该检查父母的私人成员

但是 显然 ,对于相等性和哈希,应考虑所有重要字段。

幸运的是,您可以轻松满足这两个规则。

假设您没有被NetBeans生成的equals和hashcode困扰,则可以修改Hominidae的equals方法以使用instanceof比较而不是类相等,然后直接使用它。像这样:

    @Override  
    public boolean equals(Object obj) {  
        if (obj == null) { return false; }  
        if (getClass() != obj.getClass()) { return false; }  
        if (! super.equals(obj)) return false;
        else {
           // compare subclass fields
        }

当然,哈希码很简单:

    @Override     
    public int hashCode() {     
        int hash = super.hashCode();
        hash = 89 * hash + (this.name != null ? this.name.hashCode() : 0);     
        hash = 89 * hash + (this.faceBookNickname != null ? this.faceBookNickname.hashCode() : 0);     
        return hash;     
    }

但是,严重的是:NetBeans怎么了,没有通过调用超类方法将超类字段考虑在内?



 类似资料:
  • 我试图覆盖提到的方法为我的: MyObject: 如何重写hashcode(),equals()和compareTo()方法? 目前我有以下几点: 我读到通过id比较是不够的,这是对象是数据库的持久实体(见这里)。 此类型的所有对象的名称和编号不是唯一的。 那么我应该如何覆盖它呢? 我还需要比较它里面的hashMap吗? 我很困惑。该对象唯一独特的地方是map myMap,它将在生命周期的后期填充

  • 问题内容: 什么问题/陷阱,必须重写时,必须考虑和? 问题答案: 理论(针对语言律师和数学倾向者): 必须定义一个等价关系(它必须是自反的,对称的和可传递的)。另外,它必须是一致的(如果未修改对象,则它必须保持返回相同的值)。此外,必须始终返回。 也必须是一致的(如果未根据修改对象equals(),则它必须保持返回相同的值)。 该关系的两种方法之间是: 每当a.equals(b),则a.hashC

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

  • 在阅读了大量文档和文章后,我真的对和方法感到非常困惑。主要是,有各种各样的例子和用法让我太困惑了。 那么,你能澄清一下以下几点吗? 1? 2.如果有一个唯一的键,例如,那么我们应该只使用这个字段吗?或者我们应该将它与组合,如下所示? 3.naturaid怎么样?据我所知,它用于唯一字段,例如,<代码>私有字符串isbn 。它的用途是什么?它是否与方法有关?

  • 我知道(合同)当equals被重写时,我们需要重写hashcode。为什么我要考虑用于相等比较的相同字段来计算hashcode?是否通过避免太多对象映射到相同的桶来提高性能,如下面的情况?即所有在同一“日期”创建的对象都将映射到同一桶,并且线性比较将花费时间使用equals()方法检查对象是否存在? 如果我上面的说法是真的,那么除了性能问题之外,下面的代码还会出现哪些其他潜在的问题。这是我们应该使

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha