2017-07-16 9 views
-2

私はExperement.Iという名前のカスタムクラスを作成し、equalsメソッドとhashCodeオブジェクトのメソッドをオーバーライドしました。なぜequalsメソッドからfalseを取得するのですか?

アイデアは、クラスのフィールドを比較することであり、参照はデフォルトで動作しません。ここで

は私のカスタム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; 
    }  
} 

そして、ここでは主要な方法であり、私はオーバーライドされたequalsメソッドを呼び出しました:

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しばらく実験インスタンスが同じプロパティ値を持っているのですか?

+6

あなたは 'DNAChain'でequalsをオーバーライドしていないためです。 –

+0

...または略して: '新しいDNAChain(" agact "、true).equals(新しいDNAChain(" agact "、true))== false'。 – dhke

答えて

1

DNAChainequals()メソッドを実装していません。 DNAChainオブジェクトには同じStringが含まれていますが、現在のコードと同じインスタンスであれば等しいだけです。

1

Arrays.equalsは、要素のequalsメソッドに従って配列の長さが等しく、対応する要素がnullまたは等しい場合はtrueを返します。

あなたはDNAChainequalsを上書きしない場合はそれがequalsは、そのスーパークラス、Object上で定義される方法であるため、彼らは、アイデンティティで比較されています。 2つの配列に対して別々のインスタンスDNAChainを作成するので、それらは等しくありません。

equals(およびhashCode)をDNAChainに上書きします。

+0

Andyはpost.Asのおかげで、私はArrays.equals()が2つの配列参照の対応する要素を比較することを理解していますか? – Michael

関連する問題