为什么我从equals方法得到错误?

时间:2017-07-16 11:44:33

标签: java

我创建了名为Experement的自定义类。我重写了equals和hashCode Object的方法。

我们的想法是比较类的字段而不是默认行为的引用。

这是我的自定义Experement类(您可以看到覆盖的方法):

public class Experiment {

  private   DNAChain[] Chains; // Chains found in the experiment
  private    int   counter; // next  chain  index

 public DNAChain[] getChains() {
      return Chains;
 }

 public void setChains(DNAChain[] chains) {
      Chains = chains;
 }

  public  Experiment (int  n) {
      Chains  = new DNAChain[n];
 }

 @Override
 public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;

      Experiment that = (Experiment)o;

      if (counter != that.counter) return false;

      //The two arrays are considered equal if
      //both arrays contain the same number of elements, and all corresponding
      //pairs of elements in the two arrays are equal
      return Arrays.equals(Chains, that.Chains);
  }

  @Override
  public int hashCode() {
     int result = Arrays.hashCode(Chains);
     result = 31 * result + counter;
     return result;
 }

}

这是y DNAChain课程:

public class DNAChain {
    private  String  Chain;
    private    boolean natural;

    public String getChain() {
        return Chain;
    }

    public  DNAChain (String  Chain, boolean natural) {
        this.Chain = Chain;
        this.natural = natural;
    }    
}

这是主要的方法,我调用覆盖等于方法:

public static void main(String[] args) {
    DNAChain[] chainArr1  = new DNAChain[]{new DNAChain("agact",true),
                                          new DNAChain("ctgacc",true)};

    DNAChain[] chainArr2  = new DNAChain[]{new DNAChain("agact",true),
                                           new DNAChain("ctgacc",true)};


    Experiment experiment1 = new Experiment(5);
    Experiment experiment2 = new Experiment(5);

    experiment1.setChains(chainArr1);
    experiment2.setChains(chainArr2);

    boolean isEqueal = experiment1.equals(experiment2)
    System.out.println(isEqueal);
}

我无法理解为什么在这一行:

boolean isEqueal = experiment1.equals(experiment2);

isEqual是false,而两个实验实例具有相同的属性值?

2 个答案:

答案 0 :(得分:1)

您未在equals()上实施DNAChain方法。 即使DNAChain对象包含相同的String,如果它们是相同的实例,它们也将是相同的,因为代码是当前的。

答案 1 :(得分:1)

如果数组的长度相等,则

Arrays.equals将返回true,并且相应的元素为null,或者根据元素等于equals方法。

如果您不覆盖equals中的DNAChain,则会按身份对其进行比较,因为这是equals在其超类Object上的定义方式。由于您为两个数组创建了DNAChain的单独实例,因此它们将不相等。

equals中覆盖hashCode(和DNAChain)。