5

私はここや他のサイトで多くの同様の質問を閲覧してきました。それでも、この問題に頭を悩ませることはできないようです。

私はクラスを持っています:

public class Event {
    public String Item;
    public String Title;
    public String Desc;

    @Override
    public boolean equals(Object o) {
            return true;
    }
}

このクラスをで使用しようとしていますが、仕事ArrayList<Event> eventsに取り掛かる方法が見つかりませんevents.contains("item")。デバッグを試みましたが、オーバーライドされたメソッドにさえ入らないことがわかりました。

私は何が間違っているのですか?

4

4 に答える 4

7

これは、 :のコントラクトで指定されているように対称性を破っているためです。イベントが(Stringである)に等しい場合は、イベントにも等しい必要があります。equals()"item""item"

実際、Javaが行うことはindexOf("item")、リストを呼び出して、それがポジティブであるかどうかを確認することです。

さて、例えばindexOf()このように動作ArrayListします(完全なソースコードはこちらをご覧ください):

    for (int i = 0; i < size; i++)
        if ("item".equals(elementData[i]))
            return i;

したがって、基本的にここで呼び出されるのは文字列のequals()メソッドであり、もちろんfalseを返すのはあなたのメソッドではありません。

Event次のように、関数にパラメーターを指定するだけで、この問題を解決できます。

events.contains( new Event("item", "title", "desc") )

メンバーを初期化するには、クラスに適切なコンストラクターを作成する必要があることに注意してください。

于 2012-05-26T10:19:47.367 に答える
0

また、をオーバーライドする必要がありますpublic int hashCode()。2つの方法は密接に関連しています。

これについてもっと読む:http ://www.javapractices.com/topic/TopicAction.do?Id = 17

于 2012-05-26T10:15:45.843 に答える
0

メソッドをオーバーライドする場合、メソッドは密接に関連しているため、メソッドequals()もオーバーライドする必要がありますhashcode()。2つのオブジェクトが等しい場合、それらは同じハッシュコードを持っている必要があります。ハッシュマップはこれを使用して保存場所を評価します。2つのオブジェクトが等しくない場合、それらは同じハッシュコードを持っている場合と持っていない場合があります。

于 2012-05-26T10:16:08.120 に答える
0

この場合、hashCodeメソッドではなく、equalsメソッドをオーバーライドするだけで済みます。

クラスのオブジェクトをHashMapのキーとして使用する場合は、hashCodeメソッドとequalsメソッドの両方をオーバーライドする必要があります。HashMapは、配列+linkedListの構造を使用します。キーと値のペアを追加するときは、最初にキーのhashCodeに基づいて計算を行い、配列内のインデックスを取得します。次に、そのインデックス位置にあるlinkedListを調べて、キーと値のペアがすでに存在するかどうかを確認します。はいの場合、レコードは新しい値で上書きされます。それ以外の場合は、キーと値のペアをそのlinkedListの最後に追加します。キーを見つけるときのプロセスは簡単です。したがって、hashCodeメソッドがオーバーライドされていない場合、配列内の最初のラウンドの検索は失敗します。これが、両方のメソッドをオーバーライドする必要がある理由です。これらの2つの方法の間に契約がある、またはそれらが密接な関係にあるとどこかが言っているわけではありません。

于 2014-05-02T20:46:58.667 に答える