-1

こんにちは、Memory というクラスに次のような HashSet があります。

Set<Idea> ideas = new HashSet<Idea>();

ジェネリック型「Idea」は、hashcode() と equals() をオーバーライドして作成した別のクラスです。HashSet のアイデアで Idea オブジェクトを取得し (削除しないで)、それに何かを追加して変更し、hashcode() の戻り値を変更できるようにしたいと考えています。これはうまくいかないと聞きましたが、誰も理由を説明しませんでした。これを最も効率的に行う方法を誰かに教えてもらえないだろうかと思っていました。

4

3 に答える 3

2

HashSet は、キーと同じ値を持つ HasMap を内部的に使用します。オブジェクトを Hashset に配置するために、jvm fill は最初にオブジェクトのハッシュコードを計算し、そのハッシュコードに基づいて、対応するバケットが選択され、オブジェクトが配置されます。したがって、後でハッシュコードを変更する場合オブジェクトをハッシュセットに入れると、その場所を正しく取得できなくなります。そのため、本当に要素を削除したい場合は、ハッシュセットからオブジェクトを削除して値を変更し、再度元に戻します

于 2013-01-15T05:36:02.240 に答える
1

ルックアップを実行する場合は、マップを使用する必要があります。キー(またはセットの要素)を変更する場合は、最初にキーを削除してから、もう一度追加する必要があります。このため、キーには不変のフィールドのみを含める必要があります。

于 2013-01-15T08:11:37.460 に答える
1

ハッシュコードはオブジェクトを見つけるためのキーであるため、機能しません。オブジェクトを変更してそのハッシュコードを変更すると、再度見つけることができなくなります。

辞書のエントリのようなもので、変更すると二度と見つからなくなります。それは理にかなっていますか?

于 2013-01-15T05:28:24.810 に答える