2012-11-22 33 views
7

içinde bulundu. Bazı hashCode + equals + Map şeyler ile uğraştım ve garip bir şey buldum. aşağıdaki gibi'equals()' false değerini döndürdü, ancak harita

snippet'tir:

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)); // ... 

son satırı garip bir parçasıdır:

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 

} 

Sonra böyle bir şey yaptılar. Son satır val 1 değerini döndürür. Nasıl olur? equals yöntemi her zaman false döndürür. == işleci equals den önce kullanıldığından bu mu?

Herhangi bir fikir için teşekkürler.

cevap

7

, get yöntemdir:

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; 
} 

hattı if (e.hash == hash && ((k = e.key) == key || key.equals(k))) gerçekten equals çağırmadan önce == kullanarak tuşları karşılaştırma gelmez. İşte bu yüzden eşitliği ortadan kaldırma teşebbüsünüz başarısız olur.

İlgili konular