標籤:不可 pair 類型 覆蓋 void 演算法 去掉 amp get
由於是自訂類型,所以HashMap中的equals()函數和hashCode()函數都需要自訂覆蓋。
不然內容相同的對象對應的hashCode會不同,無法發揮演算法的正常功能,覆蓋equals函數,應該就相當於c++重載==運算子來保證能判斷是否相等。只不過java沒有自訂重載運算子這個功能的,需要進行函數覆蓋。
equals的函數原型是 boolean equals(Object o);注意括弧內。hashCode的函數原型就是int hashCode();
先看一段代碼:
import java.util.*;class Pair<V,K>{ V first; K second; public Pair() {first = null;second = null;} public Pair(V f,K s){ first = f; second = s; }// public boolean equals(Object o) {// if(!(o instanceof Pair))// {// return false;// }// Pair<V,K> pn = (Pair<V,K>)o;// return pn.first.equals(first) && pn.second.equals(second);// }// public int hashCode() {// return first.hashCode() + second.hashCode();// }}public class Main { public static void main(String[] args) { Pair<String,String> p = new Pair<>("a","b"); Pair<String,String> q = new Pair<>("a","b"); System.out.println(p.equals(q)); System.out.println(p.hashCode() + " " + q.hashCode()); Map<Pair<String,String>,Integer> map = new HashMap(); map.put(p, 1); System.out.println(map.containsKey(q)); map.put(q, 2); for(Pair<String,String> key : map.keySet()) { System.out.println(map.get(key)); } }}
這段代碼把重載的兩個函數給注釋掉了,然後判斷了值相同的兩個Pair對象p和q是否相等,並輸出了他們的hashCode,同時把p放進建立的HashMap中,用q來判斷p是否存在,再把q放入,並遍曆map的values。答案是:
false
2018699554 1311053135
false
1
2
然後:
import java.util.*;class Pair<V,K>{ V first; K second; public Pair() {first = null;second = null;} public Pair(V f,K s){ first = f; second = s; } public boolean equals(Object o) { if(!(o instanceof Pair)) { return false; } Pair<V,K> pn = (Pair<V,K>)o; return pn.first.equals(first) && pn.second.equals(second); } public int hashCode() { return first.hashCode() + second.hashCode(); }}public class Main { public static void main(String[] args) { Pair<String,String> p = new Pair<>("a","b"); Pair<String,String> q = new Pair<>("a","b"); System.out.println(p.equals(q)); System.out.println(p.hashCode() + " " + q.hashCode()); Map<Pair<String,String>,Integer> map = new HashMap(); map.put(p, 1); System.out.println(map.containsKey(q)); map.put(q, 2); for(Pair<String,String> key : map.keySet()) { System.out.println(map.get(key)); } }}
然後把注釋去掉之後的結果是:
true
195 195
true
2
雖然說這裡的hashCode重載的沒有什麼道理,但是至少值相同的兩個對象他們的hashCode是相同的,這樣在HashMap中第一關判斷hashCode是否相同就過了,接著再遍曆判斷是否有值相同的元素,可以判斷是否含有某個索引值,並更新索引值的value等等。
而且要注意equals的覆蓋,參數列表不可以因為是對於Pair的就改成Pair p,這樣只是重載了並不會覆蓋。
java自訂類型 作為HashMap中的Key值 (Pair<V,K>為例)