1

equals と hashCode のコントラクトについて質問があります。

与えられた:

class SortOf { 
  String name; 
  int bal; 
  String code; 
  short rate; 
  public int hashCode() { 
    return (code.length() * bal); 
  } 
  public boolean equals(Object o) { 
    // insert code here 
  } 
} 

次のうち、このクラスの equals() および hashCode() コントラクトを満たすのはどれですか? (該当するものをすべて選択してください。)

正解C:

return ((SortOf)o).code.length() * ((SortOf)o).bal  ==  this.code.length() * 
    this.bal; 

D:

return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate ==
    this.code.length() * this.bal * this.rate; 

最後の選択肢 D について質問があります。

A: code.length=10、bal=10、rate=100

B: code.length=10、bal=100、rate=10

次にequals()、D のメソッドを使用して、正しいA.equals(B)評価を取得します。trueしかし、残高が異なるため、異なるhashCodeを取得しますか? どこかでコンセプトを誤解したのでしょうか?誰かが私のためにこれを明確にすることができますか?

4

5 に答える 5

4

おっしゃる通りです。このため、D は不適切です。

より一般的には、hashCode基本equals的に同じフィールドを同じ方法で考慮に入れる必要があります。もちろん、これは非常に奇妙なequals実装です。通常は、関連する各フィールドが等しいかどうかをチェックする必要があります。いくつかのケースでは、フィールドは乗算などを可能にする方法で相互に関連している可能性がありますが、文字列の長さが含まれるとは思いません...

人々をしばしば混乱させる重要な点の 1 つは、等しくないオブジェクトが同じハッシュ コードを持つことは有効であるということです。強調表示した場合 (異なるハッシュ コードを持つ同等のオブジェクト) は受け入れられません。

于 2010-08-05T06:01:33.150 に答える
0

.hashCode()等しいオブジェクトが同じハッシュを持つように、少なくとも で使用されるすべてのフィールドをチェックする必要があります。しかし、等号でより多くのフィールドをチェックできます。同じハッシュを持つ異なるオブジェクトを持つことはまったく問題ありません。あなたはSCJP 1.6をやっているようですか?このトピックは、Katherine Sierra と Bert Bates による SCJP 1.6 の本で詳しく説明されています。

.equals()注:それが、から定数値を返すときに便利なを実装する正当な理由です.hashCode()

于 2010-08-05T06:09:15.853 に答える
0

契約を履行することがすべてです(この質問に関する限り)。(hasCode と equal の) 異なる実装には、異なる制限と独自の利点があります。そのため、開発者がそれを確認する必要があります。

しかし、バランスが異なるため、異なるhashCodeを取得しますか?
丁度!しかし、それがオプション C を選択する必要がある理由です。この質問は、どの hascode がシナリオに適しているかではなく、契約の概念を満たすことについての理解をテストしたいのです。

より明確にする:
常に確認する必要があるのは、実装ではメソッドで使用されるのと同じインスタンス変数を使用する必要がある ことhashCode()ですequals()

ここで、これらのインスタンス変数は :code.length()でありbal、hashCode() で使用されるため、これらの同じ変数をequals()同様に使用するように制限されています。(hashCode() 実装を編集して追加できる場合を除くrate)

于 2014-02-27T05:31:08.893 に答える
-1

一般に、クラスでもう一方をオーバーライドする場合は、常に一方をオーバーライドする必要があります。そうしないと、そのクラスがハッシュマップ/ハッシュテーブルなどで使用されているときに問題が発生する可能性があります。

于 2014-07-18T08:46:05.300 に答える