2011-03-02 14 views
2

私はHashSetHashMapのようなオブジェクトのハッシュベースのコレクションを持っています。 hashCode()の実装が、いくつかの変更可能なフィールドから計算されているため、時間とともに変化するようなものであれば、どのような問題に取り組むことができますか?ハッシュベースのコレクションに格納されているオブジェクトのhashCodeを変更する

Hibernateにはどのような影響がありますか? hashCode()がデフォルトでオブジェクトのIDを返すことに何らかの理由がありますか?すべてのまだ保持されていないオブジェクトは、問題がある場合、id = 0を持ちます。

HibernateマップエンティティのためのhashCodeの妥当な実装とは何ですか?一旦IDが設定されると、IDは不変ですが、エンティティをデータベースに保存する瞬間には当てはまりません。

HashSetのパフォーマンスについて、キー= 0のダースのエンティティがあるとは心配ありません。私が気にしているのは、アプリケーションが安全にHibernateがハッシュコードとしてIDを使うことができるかどうかです。

+0

これはhashCodeに基づいて何かを格納するのに影響しますので、g-damの理由でキーを変更する必要がある場合は、1を削除してからもう一度入れてください – bestsss

+0

そのバグを見つけるまで数日かかりました。 –

答えて

3

同じオブジェクトのハッシュコードが時間とともに変化する場合、結果は基本的に予測できません。ハッシュコレクションはハッシュコードを使用してオブジェクトをバケットに割り当てます。ハッシュコードが突然変更された場合、コレクションは明らかにわからないため、別のバケットにハッシュするため、既存のオブジェクトを見つけることができません。

オブジェクトのIDを単独で返すことは悪くありませんが、多くの人が前述のようにid = 0を持つと、ハッシュテーブルのパフォーマンスが低下します。同じハッシュコードを持つすべてのオブジェクトが同じバケットに入りますので、あなたのハッシュテーブルは線形リストより優れていません。

更新:理論的には、あなたのハッシュコードは限り誰もがそれを認識していないように変更することができます - これは保持することができる任意のコレクションから、あなたのオブジェクトを削除することで彼のコメントで述べた@bestsss正確に何を意味しハッシュコードが変更されたら再度挿入します。実際には、データベースIDに頼るのではなく、オブジェクトの実際のコンテンツフィールドからハッシュコードを生成することをお勧めします。

+0

永続的にIDを変更するとどうなりますか? –

+0

@Konrad Garus:私の更新を見てください。 – casablanca

3

あなたはそのハッシュコード(及び暗に.equals()通話中に、おそらく行動)を変更するようにその状態を変異させ、その後、ハッシュベースのコレクションにオブジェクトを追加する場合は、効果は含めなく見ることができます

  • あなたが
を求めたものとは違う何かうちの取得が
  • これ以上ではないと思わコレクションに入れてスタッフさんへの制限されました

    これは確かにあなたが望むものではありません。ですから、変更可能なフィールドからのみハッシュコードを作成することをお勧めします。これは通常、フィールドfinalを作成し、その値をコンストラクタで設定することによって行われます。

  • 0

    putの後にハッシュベースのコレクションの要素のハッシュコードを変更しないでください。

    多くのプログラマーが落とし穴に陥ります。 ハッシュコードはのコレクションのアドレスであると考えることができるので、コレクションに入れられた後に要素のアドレスを変更することはできません。

    0

    Javadocは、組み込みのコレクションではこれをサポートしていないと明言しています。そうしないでください。

    関連する問題