2016-12-13 5 views
2
// this is the hashCode method of Set 
public int hashCode() { 
    int h = 0; 
    Iterator<E> i = iterator(); 
    while (i.hasNext()) { 
     E obj = i.next(); 
     if (obj != null) 
      h += obj.hashCode(); 
    } 
    return h; 
} 



//this is the hashCode method of List 
public int hashCode() { 
    int hashCode = 1; 
    for (E e : this) 
     hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); 
    return hashCode; 
} 

なぜこれらの2つの異なるアプローチを使用しますか?セットとリストの特性に関連するものはありますか? なぜ31を使用しますが、他の数字は使用しませんか? ありがとう!JavaがSetとArrayListの異なるハッシュコードメソッドを実装するのはなぜですか?

+1

List vs Setについて私はそのことについて他の質問が見つかりませんでした。しかし、約31ビットは既に答えられています。ハッシュ関数が素数を使用する理由を検索すると、他の答えと同様に、http://stackoverflow.com/questions/299304を参照してください。 – yshavit

答えて

4

セットは順序がないので、{a, b, c}は、{c, b, a}と同じハッシュコードを持つ必要があります。追加は可換ですので、要素のhashCodesを追加するとそのプロパティが得られます。そしてそれが等しくないオブジェクトを可能な限り以来、しなかった場合、それは良くなるだろう - [a, b, c][c, b, a]と同じハッシュコードを持っているかもしれないが、それはする必要はありませんので、

リストは、順序付けられています非等しいhashCodesを持つようにしなければなりません。 ArrayList.hashCode実装にはそのプロパティがあります。設定と実装はequalshashCodeSet.hashCodeList.hashCode)を定義する必要がありますどのように定義し、ので、それらのそれぞれのコレクションのいずれか(準拠)実装はほとんど同じに見えるために起こっているの両方を一覧表示することを

は注意してください。これにより、基底の実装に関係なく、同じ要素を含むSetが他のSetと同じ(したがって同じhashCodeを持ちます)という有用なプロパティが得られます。

+0

あなたの答えは非常に明確です。ありがとうございました! –

関連する問題