21

TreeSetコレクションとhashCodeメソッドについて簡単な質問があります。オブジェクトをTreeSet追加する前にTreeSet、メソッドを使用してオブジェクトが存在するかどうかを確認しますcontains

以下の例のように、hashCode メソッドの実装を使用して、それぞれが異なる hashCode を生成する 2 つの異なるオブジェクトがあります。

public int hashCode()
{
    int hash = 7;
    hash = hash * 31 + anAttribute.hashCode();
    hash = hash * 31 + anotherAttribute.hashCode();
    hash = hash * 31 + yetAnotherAttribute.hashCode();
    return hash;
}

特定の実行の hashCode は、76126352 および 76126353 です (オブジェクトは、1 つの属性で 1 桁だけ異なります)。

hashCode が異なっていても、contains メソッドはこれらのオブジェクトに対して true を返しています。理由はありますか?これは本当に紛らわしいので、助けていただければ幸いです。

4

4 に答える 4

47

TreeSet はまったく使用hashCodeしません。compareToまたはコンストラクターに渡した Comparator を使用します。これは、セット内のオブジェクトを検索するために、contains などのメソッドによって使用されます。

したがって、あなたの質問に対する答えは、問題の 2 つのオブジェクトが等しいと見なされるように、compareTo メソッドまたは Comparator が定義されていることです。

javadoc から:

TreeSet インスタンスは、compareTo (または compare) メソッドを使用してすべての要素の比較を実行するため、このメソッドによって等しいと見なされる 2 つの要素は、セットの観点からは等しいと見なされます。

于 2009-09-24T10:06:58.593 に答える
4

Java Doc から:

equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。

意味: ハッシュに使用するオブジェクトが等しくありません。

于 2009-09-24T10:01:25.903 に答える
0

Joshua Bloch の「Effective Java」の第 3 章を読む必要があります。ここでは、equals 契約と、equals、hashCode、compareTo を適切にオーバーライドする方法について説明しています。

于 2009-09-24T10:10:47.543 に答える
0

insert() は基本的に挿入ポイントに向かう途中で同じ操作 (つまり、適切な位置の検索) を行うため、含まれているかどうかを確認する必要はありません。オブジェクトを挿入できない場合 (つまり、オブジェクトが既に含まれている場合)、insert は false を返します。

于 2010-03-29T13:46:38.960 に答える