Java Set <>(または、その点については<>のキー)に含まれるオブジェクトがある場合は、 (hashCode()
、equals()
、compareTo()
等を介して)同一性または関係を決定するために使用されるコレクションの操作のために指定されていない動作を引き起こすことなく、変更することはできないのですか? (編集:this other questionで示唆したように)Java Set内のオブジェクトの可変フィールド
(言い換えれば、これらのフィールドは不変であるべきか、あなたは、コレクションから削除するオブジェクトを要求すべきである、そしてその後、再挿入、変更。)
ザ・私が尋ねる理由は、私はHibernate Annotations reference guideを読んでいたということであり、そこHashSet<Toy>
があるが、Toy
クラスは変更可能であり、hashCode()
計算にも使用されているフィールドname
とserial
を持っている例があります...赤い旗が私の中に消えました私はちょうど私がそれの意味を理解していることを確認したかった。正しい
私はちょうどこれが本当に悪い例であることを知った。私はまだ参照を保持していたので、最後のcontains()は実際にtrueを返します。 HashMapsは別の問題ですが、3日間の週末はほとんど終了しているので、例を掘り起こしたくありません。 –
heh、戻ってきたら何かを投稿してください - 楽しみにしています。 –
もう一度、HashSetがHashMapをバッキングとして使用しているのを忘れました。バッキングHashMapはハッシュコードを使用してバケット内の要素に対してequals()をチェックする前にバケットにジャンプし、要素を変更すると間違ったバケットにジャンプして要素を見つけられません。 –