6

私は HashSet を使用しており、オブジェクトの ID を変更する必要がありますが、ハッシュコードが変更され、HashSet と hashCode() メソッドのルールが壊れます。

最善の解決策は何ですか: Set からオブジェクトを削除して新しい ID を持つオブジェクトを追加するか、Set 内のすべてのオブジェクトにハッシュ コード (コンストラクターで生成されたものなど) を保持するか、またはこの問題を解決する他の方法はありますか?

手伝ってくれてありがとう。

更新: 私は間違いを犯しました: ハッシュ コードをオブジェクトに保持するのはひどいことです。その場合、等しいオブジェクトは異なるハッシュ コードを持つことができるからです。

4

1 に答える 1

10

コンテナとしてのHashSetは、入れたアイテムのハッシュコードを介してそのアイテム(contains、remove)にアクセスします。ハッシュコードは、多くの場合、インスタンスメンバーの状態によって作成されます。したがって、ハッシュコードは、オブジェクトの状態の操作によって変化します。

Objectのドキュメントには、「hashCode()メソッドの一般的なコントラクトを維持します。これは、等しいオブジェクトには等しいハッシュコードが必要であると述べています」と書かれています。

お気づきのとおり、HashSetに保持しているオブジェクトの状態を変更すると、そのオブジェクトにremoveメソッドでアクセスしたり、HashMapのcontainsメソッドで検出したりすることができなくなります。

提供しているオプションは次のとおりです。

  1. オブジェクトを削除し、変更してから再度追加します-HashSetが必須の場合は、すばらしい、最も簡単な方法で機能します

  2. ハッシュコードの値を「どこかに」保持します-つまり、等しくないオブジェクトに対して同じハッシュコードがあります。または、ドキュメントに従うと、等しいが同じハッシュコードを持つ2つのオブジェクトに遭遇する可能性がありますが、それらのメンバー変数は異なります。これにより、予期しないエラーが発生する可能性があります。

于 2012-07-17T20:55:20.067 に答える