2012-11-22 41 views
7

में पाया जाता है मैं कुछ हैशकोड + बराबर + मैप सामान के साथ गड़बड़ कर रहा था और कुछ पाया ... अजीब।'बराबर()' झूठा रिटर्न देता है, फिर भी ऑब्जेक्ट

टुकड़ा इस प्रकार है:

java.util.Map<Obj,String> map = new java.util.HashMap<Obj,String>(); 
    Obj o1 = new Obj("1"); 
    Obj o11 = new Obj("1"); 
    Obj o2 = new Obj("2"); 

    map.put(o1,"val 1"); 
    map.put(o11,"val 2"); 
    map.put(o2,"val 3"); 

    p("size = " + map.size()); // obviously 3 
    p(map.get(new Obj("1"))); // obviously null  
    p(map.get(o1)); // ... 

अंतिम पंक्ति अजीब हिस्सा है:

class Obj { 
    String n; 
    Obj(String n) {this.n = n;} 

    public int hashCode() {return 0;} 
    public boolean equals(Object o) {return false;} // no instance of this class 
                // equals any other instance 

} 

तो मैं कुछ इस तरह से किया था। अंतिम पंक्ति val 1 लौटाती है। कैसे? equals विधि हमेशा false देता है। क्या ऐसा इसलिए है क्योंकि == ऑपरेटर का उपयोग equals से पहले किया जाता है?

किसी भी अंतर्दृष्टि के लिए धन्यवाद।

उत्तर

7

HashMap.java में, get विधि है:

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

लाइन if (e.hash == hash && ((k = e.key) == key || key.equals(k))) वास्तव में equals कॉल करने से पहले == का उपयोग कर कुंजी तुलना करता है। यही कारण है कि समानता को खत्म करने का आपका प्रयास विफल रहता है।