0

HashMap があり、次のように使用されます。

HashMap<SomeInterface, UniqueObject> m_map;

UniqueObject getUniqueObject(SomeInterface keyObject)
{
     if (m_map.containsKey(keyObject))
     {
         return m_map.get(keyObject);
     }
     else
     {
         return makeUniqueObjectFor(keyObject);
     }
}

私の問題は、m_map.containsKey(keyObject) の同じキーに一致する異なるクラスの複数のオブジェクトが表示されることです。

だからここに私の質問があります:

  1. これは可能ですか?Map インターフェイスは、キーが null でないかどうかを比較するために equals() を使用すると述べています。どの SomeInterface クラスでも equals() をオーバーライドしていません。これは、 equals メソッドが間違っている可能性があることを意味しますか?

  2. 上記が当てはまる場合、実際には同じオブジェクトでありコピーではない場合、HashMap が equals() でのみ true を返すようにするにはどうすればよいですか? これは、if (object1 == object2) と言って可能ですか? Java 開発の早い段階で、それを避けるべきだと言われましたが、いつそれを使用すべきかわかりませんでした。

前もって感謝します。:)

4

5 に答える 5

6

私はあなたが問題を誤診したと強く疑っています。equalsどこもオーバーライドしていない場合(およびオーバーライドする他のものをサブクラス化していない場合equals) は、実際に「アイデンティティ」動作を行う必要があります。

正直なところ、そうではないと聞いてショックを受けました。

問題を実証する短いが完全なプログラムを作成できれば、調査が容易になりますが、今のところ、異なるオブジェクトが等しいキーとして扱われているというあなたの疑いを再確認したいと思います。

于 2010-12-02T12:59:56.157 に答える
3

のデフォルトの実装はequals()、java.lang.Object で行われます。

public boolean equals(Object obj) {
return (this == obj);
}

デフォルトのその他のメソッドhashCode();は、オブジェクトへの何らかの参照を返します。つまり、どちらもデフォルトで一意です。Equals は同じオブジェクトに対してのみ true を返し、hashCode() はオブジェクトごとに異なります。

これはまさに、ある種の複数のエントリを作成できるものです。クラスのインスタンスを 2 つ作成できます。あなたの観点からは、同じデータが含まれているため、それらは等しいです。しかし、それらは異なります。したがって、これらのオブジェクトをマップのキーとして使用している場合、2 つのエントリが生成されます。これを回避したい場合は、クラスに equals と hashCode を実装してください。

この実装は非常に冗長な場合があります。Jakarta プロジェクトの HashCodeBuilder および EqualsBuilder が役立つ場合があります。次に例を示します。

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

@Override
public boolean equals(Object other) {
    return EqualsBuilder.reflectionEquals(this, other);
}

@Override
public String toString() {
    return ToStringBuilder.reflectionToString(this);
}
于 2010-12-02T13:11:34.967 に答える
0

.equals()メソッドと.hashCode()メソッドが、HashMapに格納するすべてのオブジェクトに実装されていることを確認する必要があります。それを持たないことは、あらゆる種類の問題を招きます。

于 2010-12-02T13:02:18.140 に答える
0

でキーとして使用するオブジェクトのequals()およびメソッドを実装する必要があります。hashCode()HashMap

HashMapを使用するだけでなくequals()、 も使用することに注意してくださいhashCode()。メソッドhashCode()の実装と一致するように、メソッドを正しく実装する必要がありますequals()。これらのメソッドの実装が一致しない場合、予期しない問題が発生する可能性があります。

詳細な要件については、クラスの説明equals()hashCode()クラスの API ドキュメントを参照してください。Object

于 2010-12-02T13:07:25.313 に答える
0

参考までに、Eclipse などの IDE に hashCode & equals メソッドを生成させることができます。自分でコーディングしようとするよりも、おそらくうまくいくでしょう。

于 2010-12-02T16:37:03.197 に答える