2012-01-06 17 views
6

セットに2つの同一オブジェクトを追加した後、セットには1つのエレメントしか含まれません。Java:2つの同じオブジェクトをセットに追加した後、2つのエレメントが含まれています

public void addIdenticalObjectsToSet(){ 
    Set<Foo> set = new HashSet<Foo>(); 
    set.add(new Foo("totoro")); 
    set.add(new Foo("totoro")); 
    Assert.assertEquals(1, set.size());   // PROBLEM: SIZE=2 
} 

private class Foo { 
    private String id; 
    public Foo(String id) { 
     this.id = id; 
    } 
    public String getId() { 
     return id; 
    } 
    public boolean equals(Object obj) { 
     return obj!= null && obj instanceof Foo && 
      ((Foo)obj).getId().equals(this.getId()); 
    } 
    public int hashcode() { 
     return this.getId().hashCode(); 
    } 
} 

同じid(String)を持つ場合、2つのオブジェクトが同一であると見なします。

他の変わったこと:Foo.equalsもFoo.hashcodeも、デバッグ/ブレークポイントを使って知る限り、アクセスされません。私は何が欠けていますか?

+2

@Overrideアノテーションを使用してください –

+2

オーバーライドされていると思われるメソッドに@Overrideを適用してみてください。 –

答えて

15
public int hashcode() { 
     return this.getId().hashCode(); 
    } 

は注釈がスペルの間違いについてのあなたに言っただろう

@Override 
public int hashCode() { 
     return this.getId().hashCode(); 
    } 

でなければなりません。

インタフェースが実装されているか、親メソッドがオーバーライドされているかどうかを示すメソッドには、IDEに(欠落している)小さな三角形のシンボルがあるはずです。

+0

+1: 'compareTo'の代わりに' compareto'を使用するのと同じです。 Java 6 JDKに 'hashcode'メソッドがあります; –

+0

ニース、ありがとう!私は常に@Overrideを使うことを覚えています。 –

+0

私はFindBugsもこれをキャッチしたと思います。 'equals'を実装していますが、' hashCode'は実装していません。 – Thilo

関連する問題