शामिल मेरी कोड है:HashSet यहां विधि, अजीब व्यवहार
public class testGui {
public static void main(String[] arg){
class TESTS{
String t;
public TESTS(String t){
this.t = t;
}
@Override
public boolean equals(Object x){
System.out.println("My method is called...");
if(x instanceof TESTS){
TESTS zzz = (TESTS) x;
return zzz.t.compareTo(t)==0;
}
else return false;
}
}
HashSet<TESTS> allItems = new HashSet<TESTS>();
allItems.add(new TESTS("a"));
allItems.add(new TESTS("a"));
System.out.println(allItems.contains(new TESTS("a")));
}
}
मैं नहीं मिलता है क्यों HashSet शामिल विधि बुला नहीं है मेरी बराबरी पद्धति के रूप में अपने विनिर्देशों में mentionned:
अधिक औपचारिक रूप से , अगर यह सेट कोई तत्व ई तरह के होते हैं इस सेट करने के लिए, निर्दिष्ट तत्व को जोड़ता है ओ, कि (ओ == बातिल ई == बातिल: o.equals (ई))
मेरा कोड गलत लौट रहा है और मेरे बराबर विधि में नहीं जा रहा है।
उत्तर देने के लिए बहुत बहुत धन्यवाद!
उन्हें असमान नहीं माना जाएगा। यह सिर्फ इतना है कि हैशसेट भी बराबर विधि का आह्वान नहीं करेगा क्योंकि यह केवल हैशकोड के लिए एक ही बाल्टी की ओर जाता है। और केवल हैशकोड को ओवरराइड करने का कोई अर्थ नहीं है, क्योंकि हैशसेट हमेशा उसी हैशकोड वाले ऑब्जेक्ट्स के बराबर कॉल करेगा। –
@ जेबी, हां, तथ्य यह है कि वे अलग-अलग बाल्टी का नेतृत्व करते हैं, इसका मतलब है कि उन्हें 'असमान' माना जाता है (विभिन्न वस्तुओं के रूप में माना जाता है)। जब मैं उस शब्द का उपयोग करता हूं तो मैं 'बराबर' विधि का जिक्र नहीं कर रहा हूं। मैं केवल 'हैशकोड' को ओवरराइड करने पर भी सहमत हूं, इसलिए मैं इसके खिलाफ दृढ़ता से अनुशंसा करता हूं। हालांकि, यह अनुबंध तोड़ नहीं है। –
यह अच्छा होगा अगर जावा दस्तावेज का उल्लेख है कि हैशकोड को पहले कहा जाता है। मैं जावा 5 में इस मुद्दे से जला दिया गया। – Aaron