2012-01-06 3 views
6

सेट में दो समान ऑब्जेक्ट जोड़ने के बाद, मैं उम्मीद करता हूं कि सेट में केवल एक तत्व हो।जावा: सेट में 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(); 
    } 
} 

मैं दो वस्तुओं को समान मानता हूं यदि उनके पास एक ही आईडी (स्ट्रिंग) है।

अन्य अजीब चीज: न तो Foo.equals और न ही Foo.hashcode तक पहुंचा जा सकता है, जहां तक ​​मैं डीबग/ब्रेकपॉइंट्स का उपयोग करके बता सकता हूं। मैं क्या खो रहा हूँ?

+2

@ ओवरराइड एनोटेशन –

+2

का उपयोग करने का प्रयास करें उन विधियों पर @ ओवरराइड लागू करने का प्रयास करें जो आपको लगता है कि –

उत्तर

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

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

होना चाहिए एनोटेशन वर्तनी की गलती के बारे में आप बता दिया होता।

यह भी इंगित करने के लिए कि क्या एक इंटरफेस लागू किया जा रहा है या माता-पिता विधि ओवरराइड किया गया है, इस विधि पर आपके आईडीई में एक छोटा (लापता) छोटा त्रिकोण प्रतीक होना चाहिए।

+0

+1: 'तुलना करने के बजाय' तुलनात्मक 'का उपयोग करने के समान। जावा 6 जेडीके में एक हैशकोड विधि है;) –

+0

अच्छा, बहुत बहुत धन्यवाद! मुझे हमेशा @ ओवरराइड का उपयोग करना याद रहेगा। –

+0

मुझे लगता है कि FindBugs भी इसे पकड़ा होगा। 'बराबर' लागू करने के बारे में कुछ लेकिन 'हैशकोड 'नहीं। एक ईगल की आंखों के लिए – Thilo

संबंधित मुद्दे