2015-04-25 30 views
2

我一直認爲帽子HashMap通過使用hasCode和equals來識別它的關鍵。但是這段代碼仍然沒有給我價值回報。我錯過了什麼?Java如果hashCode相同並且equals爲true,HashMap如何識別關鍵對象?

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by kic on 25.04.15. 
*/ 
public class TypePair { 
    private final Class a; 
    private final Class b; 

    public TypePair(Class a, Class b) { 
     this.a = a; 
     this.b = b; 
    } 

    public TypePair(Object a, Object b) { 
     this.a = a.getClass(); 
     this.b = b.getClass(); 
    } 

    public boolean isPair (Object a, Object b) { 
     return this.a.isAssignableFrom(a.getClass()) && this.b.isAssignableFrom(b.getClass()); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (obj instanceof TypePair) { 
      return a.isAssignableFrom(((TypePair) obj).a) && b.isAssignableFrom(((TypePair) obj).b); 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public int hashCode() { 
     return 1; 
    } 

    public static void main(String[] args) { 
     TypePair a = new TypePair(Number.class, String.class); 
     TypePair b = new TypePair(12, "hello"); 

     Map<TypePair, Boolean> test = new HashMap<>(); 
     test.put(a, true); 

     System.out.println(a.hashCode() == b.hashCode()); 
     System.out.println(a.equals(b)); 
     System.out.println("und? " + test.get(a)); 
     System.out.println("und? " + test.get(b)); 
    } 
} 

此代碼打印:

true 
true 
und? true 
und? null 
+6

檢查什麼'b.equals(一)'回報。 – resueman

+0

@resueman該死的,你是對的! – KIC

回答

6

你實現equals()違反合同(它不是對稱的),這就是爲什麼它不能正常工作。

你需要使用類似:

@Override 
public boolean equals(Object obj) { 
    if (obj instanceof TypePair) { 
     TypePair objTypePair = (TypePair) obj; 
     return a   .isAssignableFrom(objTypePair.a) && b   .isAssignableFrom(objTypePair.b) || 
       objTypePair.a.isAssignableFrom(a)    && objTypePair.b.isAssignableFrom(b); 
    } else { 
     return false; 
    } 
} 
+0

你是對的:'return(a.isAssignableFrom(((TypePair)obj).a)&& b.isAssignableFrom(((TypePair)obj).b))|| obj.equals(this);'它工作。 – KIC

+0

或者只是'this.a == that.a && this.b == that.b'。 – Radiodef

+0

@Radiodef我認爲你沒有得到我想要匹配超級類的觀點,所以this.a從來就沒有.a – KIC

相關問題