java自訂類型 作為HashMap中的Key值 (Pair<V,K>為例)

來源:互聯網
上載者:User

標籤:不可   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>為例)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.