2011-10-23 7 views
1

これは私の実装の一部奇妙なHashSetの行動

public class Fault { 
    int nodeIndex; 
    boolean val; 
} 

Display() { 
    Object [] temp; 
    temp = aFList2.toArray(); 
    for(int i=0;i<temp.length;i++) 
     ((Fault) temp[i]).display(); 
} 

結果、以下のように障害クラスがある

aFList = new HashSet<Fault>(); 
bFList = new HashSet<Fault>(); 
oFList = new HashSet<Fault>(); 

temp.addAll(aFList); 
temp.addAll(bFList); 
oFList.addAll(temp); 

です:

14_true 
6_true 
17_false 
16_false 
16_false 
9_false 
14_true 

が質問:なぜ私は繰り返し、リスト要素を得るのですか? oFListにはすでにこれらの要素が含まれていた可能性がありますが、HashSetは重複を処理すると考えていました。何か不足していますか?

答えて

4

クラスをHashMapまたはHashSetに配置する場合は、equals()およびhashCode()を実装する必要があります。

+1

まあ、そうする必要はありません。しかし、 "等価な"インスタンスを同じエントリにマッピングする必要がある場合は、そうする必要があります。 –

+0

私はequal()を持っていますが、hashcode()はありません。私はそれを必要としますか? – SP6

+1

@pleasedeleteme - そうです。 'equals()'をオーバーライドするたびに、 'equals()'メソッドの動作にマッチする 'hashcode()'が必要です。 –