天天看點

不要小瞧了Map接口,實作一個Map對象并不簡單!

不要小瞧了Map接口,實作一個Map對象并不簡單!

這篇文章我們不談别的,就講講Map接口,以及Map集合的一個重要的概念,Map的元素的散列。

實作Map接口

如果我們想自己定義一個Map需要做什麼呢?

第一步:首先這個類繼承

AbstractMap<K,V>

第二步:重寫 put()方法和get()方法,來定義我們自己的放入元素和擷取元素的邏輯

第三步:實作entrySet()抽象方法,

AbstractMap

類的entrySet()方法是首先方法,需要子類來進行實作,而這個方法傳回的類型是Map.Entry類型的set對象集合,深入Map接口的源碼我們知道Map.Entry也是一個接口,每個實作Map接口的方法都需要實作Map.Entry接口來定義Map中元素的資料結構,比如HashMap中的Node就是實作Map.Entry接口的内部類,定義基本的節點。那麼定義完Map.Entry接口的實作類之後,entrySet()方法中把Map.Entry接口的實作類放入Set集合中就可以了。

散列

散列的目的就是讓元素更快的被找到。我們可以用數組來存儲的元素,但元素的存儲的依據并不是根據map的鍵資訊的,因為資料有有一定的容量,而鍵沒有。是以元素的存儲是通過散列碼來實作的,根據散列碼确定元素放入數組哪個位置中,散列碼的産生是通過散列函數來實作,hashCode()方法就是一個重要的散列函數。

在Map類的集合中,哈希碼是一個重要的概念,也是散列碼,它是通過hashCode()方法得到的。對于同一個對象,hashCode()方法傳回的值是一緻的,是以我們看兩個對象是否為同一對象的時候,通過是通過哈希碼來進行比較。

String類型的哈希碼與String的内容有關,當兩個String類型的内容相同的時候,String對象會指向同一個記憶體區域,它們的哈希碼也就是一緻的,這是和其他對象不同的地方。通過看String的hashCode()方法的源碼我們就能證明這一點

String的hashCode()方法:

public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
           

總結

❤️ 感謝大家

  1. 歡迎關注我❤️,點贊👍🏻,評論🤤,轉發🙏
  2. 關注

    盼盼小課堂

    ,定期為你推送好文,還有群聊不定期抽獎活動,可以暢所欲言,與大神們一起交流,一起學習。
  3. 有不當之處歡迎批評指正。