深入理解java中HashMap的使用
阿新 • • 發佈:2019-02-19
當你自己建立用作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方法必須滿足五個條件:
- 自反性。對任意的x, x.equals(x)一定返回true;
- 對稱性。對任意x和y,如果y.equals(x)返回true, 則x.equals(y)也 返回true;
- 傳遞性。對任意x,y,z ,如果有x.equals(y)返回true; y.equals(z)返回true,則x.equals(z)一定返回true;
- 一致性。對任意x和y,如果物件中用於等價比較的資訊沒有改變,那麼無論呼叫多少次,返回的都是一致的,
- 對任何不是null的x, x.equals(null)一定返回false