1. 程式人生 > >深入理解java中HashMap的使用

深入理解java中HashMap的使用

當你自己建立用作hashMap的鍵的類,用可能會忘記其中需要覆蓋的一些必須方法,而這種會是一個致命的錯誤
例如,有兩個物件,將Person物件與Dog物件聯絡起來,這看起來很簡單,使用Person作為鍵,Dog作為值:

public class Person{
    protected int number;
    public Person(int i){ number = i;}
    public String toString(){
        return "Person " + number;
    }
}

public class Dog{
    private
static Random rand = new Random(47); private boolean shadow = rand.nextInt(); public String toString(){ if(shadow){ return "dog is likely"; }else{ return "dog is badly"; } } } public class App{ public static <T extends Person> void
execute(Class<T> type){ Constructor<T> ghog = type.getConstructor(int.class); Map<Person, Dog> map = new HashMap<Person, Dog>(); for(int i= 0; i < 10; i ++){ map.put(ghog.newInstance(i), new Dog()); } print("map = " + map); Person p = ghog.newInstance(3
); print("Look up for " + p); if(map.containsKey(p)){ print(map.get(gh)); }else{ print("key not found: " + p); } } public static void main(String[] args) throws Exception{ execute(Person.class); } //output }

每個Person被賦予一個數字,於是可以在HashMap中查詢值,但

Person是自動繼承Object的,所以這裡的使用了Object的

hashcode()方法生成雜湊碼,而他預設使用物件地址計算雜湊碼,

因此,兩者之間其實是不同的鍵,所以這裡,我們需要覆蓋原始的hashCode方法和equals方法,

正確的equals方法必須滿足五個條件:

  1. 自反性。對任意的x, x.equals(x)一定返回true;
  2. 對稱性。對任意x和y,如果y.equals(x)返回true, 則x.equals(y)也 返回true;
  3. 傳遞性。對任意x,y,z ,如果有x.equals(y)返回true; y.equals(z)返回true,則x.equals(z)一定返回true;
  4. 一致性。對任意x和y,如果物件中用於等價比較的資訊沒有改變,那麼無論呼叫多少次,返回的都是一致的,
  5. 對任何不是null的x, x.equals(null)一定返回false