第二十四講 Map接口與HashMap基本使用和HashMap源碼分析與哈希表實現原理及Hashtable與LinkedHashMap

導讀:

        好久沒有更新博客了,因爲這半年要負責一個廣佛企業項目。今天開始,要繼續寫完這些博客的內容。現在Java的視頻又變得越來越多了,我要改變一下博客的寫作風格和內容層次了。以重點難點爲主,實戰爲輔助的方式來寫應該會更有幫助。


一、Map接口與HashMap基本使用

        首先,我們來看一下Map接口。它也是一個集合,只是它是以HashTable(IT中俗稱的“哈希表)的存儲方式一樣。以”鍵/值“的方式來保存和管理對象。默認的保存類型也是Object,所以很容易讓我們想起其他集合的默認保存的數據類型是一模一樣的。(HashMap是Map的實現[子]類)

        直接看一下代碼吧,這樣可以先入爲主:

        Map map = new HashMap(); // 這個是簡單的定義格式

        完整格式:

        Map<Object,Object> hashMap = new HashMap<Object,Object>(); // 回憶一下就知道是“多態特性”。

        hashMap.put(ObjectID,ObjectType); // 保存object類型的數據,包含自定義的類。

        比如:

        class Person{// 代碼省略先,我主要是想通過這個形式解釋該集合保存對象的方式}

        Person p1 = new Person();

        Person p2 = new Person();

        Person p3 = new Person();

       HashMap<String,Person> perMap = new HashMap<String,Person>(); // 看到了嗎,加入了泛型技術來約束。

        perMap.put("A001",p1);

        perMap.put("A002",p2);

        perMap.put("A003",p3);

        // ok,到這裏就不寫了。已經到達解釋的目的了,不是嗎?o(∩_∩)o 

        備註:其中put前面的ObjectID,即A001、A002,這些是不能重複的,因爲通過源碼我們可以知道put的id是set來默認維護的,因此是不可重複的。

   

二、哈希表的實現原理

    它是內存中是以“鍵/值”的形式所存儲。(先不管其他的,但這句話您一定要記住!)

    哈希表hashtable(key,value) 就是把Key通過一個固定的算法函數既所謂的哈希函數轉換成一個整型數字,然後就將該數字對數組長度進行取餘,取餘結果就當作數組的下標,將value存儲在以該數字爲下標的數組空間裏。(或者:把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。)
    而當使用哈希表進行查詢的時候,就是再次使用哈希函數將key轉換爲對應的數組下標,並定位到該空間獲取value,如此一來,就可以充分利用到數組的定位性能進行數據定位。

(1)、數組的特點是:尋址容易,插入和刪除困難;
(2)、而鏈表的特點是:尋址困難,插入和刪除容易。

    

三、HashMap與LinkedHashMap的區別


    * HashMap是無序的,LinkedHashMap是有序的。

    【保持插入順序的LinkedHashMap 和 保持訪問順序的LinkedHashMap

    

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章