9

Comparable compareTo メソッドを実装するクラス「Accumulator」があり、これらのオブジェクトを HashSet に入れようとしています。

HashSet に add() すると、ブレークポイントを設定した場所に関係なく、デバッガーの compareTo メソッドにアクティビティが表示されません。さらに、add() の処理が完了すると、Set 内にいくつかの重複が表示されます。

ここで私は何を台無しにしていますか。なぜそれは比較していないので、重複を許可するのですか?

ありがとう、
IVRアベンジャー

4

8 に答える 8

17

ここで私は何を台無しにしていますか?

HashSetは、に基づいておりhashCode()、に基づいていませんcompareTo()。と混同している可能性がありますTreeSet。どちらの場合も、必ずequals()他の方法と一致する方法で実装してください。

于 2010-06-02T20:30:44.780 に答える
11

とを正しく実装する必要がありhashCode()ますequals()

hashCode2つの等しいオブジェクトが同じハッシュコードを持つように、クラスの値に基づいて数値をオーバーライドして返す必要があります。

于 2010-06-02T20:30:13.947 に答える
6

HashSet は、メソッドhashCode()equals()メソッドを使用して、重複が追加されるのを防ぎます。まず、追加するオブジェクトのハッシュ コードを取得します。次に、そのハッシュ コードに対応するバケットを見つけ、メソッドを使用してそのバケット内の各オブジェクトを繰り返し処理equals()し、セット内に同一のオブジェクトが既に存在するかどうかを確認します。

!compareTo()で使用されていないため、デバッガーは壊れていません。HashSet

ルールは次のとおりです。

  1. 2 つのオブジェクトが等しい場合、それらのハッシュ コード は等しくなければなりません。

  2. しかし、2 つのオブジェクトのハッシュ コードが等しい場合、これはオブジェクトが等しいという意味ではありません。2 つのオブジェクトがたまたま同じハッシュを持つ可能性があります。

于 2010-06-02T20:53:12.677 に答える
2

hashCodeが2つのオブジェクトに対して異なる値を返す場合、equalは使用されません。ところで、compareToはコレクションのハッシュとは何の関係もありません:)しかしソートされたコレクション

于 2010-06-02T20:31:32.597 に答える
2

あなたのComparableオブジェクトは. _ _equals()HashSetshashCode()hashCode()(a.equals(b) == true)

于 2010-06-02T20:34:48.163 に答える
2

人々が無視しがちなことの 1 つが、大きな間違いにつながります。equals メソッドを定義している間は、常にパラメーターをオブジェクト クラスとして受け取り、オブジェクトを目的のクラスに変換します。例えば

   public bolean equals(Object aSong){
     if(!(aSoneg instanceof Song)){
       return false;
     }
     Song s=(Song) aSong;
     return getTitle().equals(s.getTitle());
   }

Object aSong の代わりに write Song aSong を渡すと、equals メソッドが呼び出されることはありません。

お役に立てれば

于 2013-04-04T19:49:06.520 に答える
1

HashSetはhashCodeとequalsを使用します。TreeSetはComparableインターフェースを使用します。注:ハッシュコードまたはequalsのいずれかをオーバーライドする場合は、常にもう一方をオーバーライドする必要があります。

于 2010-06-02T20:31:09.350 に答える
1

クラスAccumulatorのオブジェクトを作成するたびに、 JVMで新しいスペースが必要になり、 hashSetにオブジェクトを追加するたびに一意のhashCodeが返されます。hashCode()メソッドをオーバーライドしていないため、オブジェクトの値に依存しません。したがって、プログラムで作成されたすべてのオブジェクトで一意の hashCode を返すObjectクラスのhashCode()メソッドを呼び出します。

解決:

hashCode()およびequals()メソッドをオーバーライドし、クラスのプロパティに応じてロジックを適用します。equals と hashcode のコントラクトを必ずお読みください

http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html

于 2012-12-14T07:45:52.797 に答える