我创建了名为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
,而两个实验实例具有相同的属性值?
答案 0 :(得分:1)
您未在equals()
上实施DNAChain
方法。
即使DNAChain
对象包含相同的String
,如果它们是相同的实例,它们也将是相同的,因为代码是当前的。
答案 1 :(得分:1)
Arrays.equals
将返回true,并且相应的元素为null,或者根据元素等于equals
方法。
如果您不覆盖equals
中的DNAChain
,则会按身份对其进行比较,因为这是equals
在其超类Object
上的定义方式。由于您为两个数组创建了DNAChain
的单独实例,因此它们将不相等。
在equals
中覆盖hashCode
(和DNAChain
)。