8

Java には、2 つの文字列と整数を含む型で構成される ArrayList があります。この ArrayList の 1 つの要素が別の要素と等しいかどうかは正常にテストできますが、contains メソッドが失敗することがわかりました。これは、私のタイプがプリミティブではないという事実によるものだと思います。

現在、これに代わる 2 つの選択肢があり、どちらが最適な選択肢なのだろうかと思います。

  1. ArrayList を反復処理し、探している要素と各要素が等しいかどうかをテストしてから、ループを中断することにより、独自の contains メソッドを実装します。

  2. または、ArrayList の代わりに値として整数を使用して、私のタイプの HashMap をキーとして使用します。ここでは、メソッド containsKey を使用して、HashMap に要素が既に存在するかどうかを確認できます。

#2へのアプローチに関する唯一の注意点は、私の場合、値が大幅に冗長であることです。

4

5 に答える 5

23

ほとんどの場合、単に型をオーバーライドするのを忘れているだけequals()ですhashCode()。をチェックするequals()ものです。contains()

Javadocから:

trueこのリストに指定された要素が含まれているかどうかを返します。より正式には、このリストに次のようなtrue要素が少なくとも 1 つ含まれている場合にのみを返します。e(o==null ? e==null : o.equals(e))

参照の等価性のテストのデフォルトの実装であるため、equalsこのようなカスタム データ型には適していません。

equals(また、 andをオーバーライドしなかった場合hashCode、型を a のキーとして使用してHashMapも同様に無駄です。)


編集:オーバーライドするには、正確な署名を提供する必要があることに注意してください。

class MyDataType {
    public boolean equals(MyDataType other) { // WRONG!
        ...
    }
    public boolean equals(Object other) { // Right!
        ...
    }
}

@Overrideこれは、注釈を使用するための非常に強力な議論です。最初の例は、注釈が付けられている場合、コンパイル時に失敗します@Override

于 2009-06-12T14:29:03.437 に答える
14

私の推測では、equals(Object) をオーバーライドする代わりに、「厳密に型指定された」equals メソッドのみを記述したと思われます。言い換えれば、あなたが持っている場合:

public boolean equals(Foo f)

あなたが必要

public boolean equals(Object o)

同様に、Object.equals をオーバーライドします。

テストはおそらく厳密に型指定された equals を呼び出すため、「equals は機能しますが、contains は機能しませんが、ArrayList は機能しません。

于 2009-06-12T14:34:17.327 に答える
3

equals メソッドをオーバーライドしましたか? これは、contains を正しく機能させるために必要です。

于 2009-06-12T14:29:50.143 に答える
0

代わりに Integer クラスを使用しますか? 次に、オブジェクトの比較を行うことができます

于 2009-06-12T14:30:41.937 に答える