HashMap做爲一種高效的Map結構,已經成爲了Java當中一門不可或缺的高效執行方式。算法
HashMap繼承了AbstractMap,實現了Map接口,Cloneable,Serailizable接口。數組
Node類實現了Map.Entry接口,裏面有Key,value,hash,next節點.內部擁有這些節點的get,set方法,setValue方法傳入新值,返回 舊值。code
個人理解是這樣的,Node其實只是鏈表節點而已,一個hashmap可能有多個鏈表節點,由於鏈表的Node實際上是實現了Map.Entry接口,而這個接口實際上是一個內部接口的實例,裏面確定也實現了接口的方法,不過很奇怪的是,這裏面用到的只是單向鏈表,並無前驅節點,它的後置節點是指向鏈表的下一個元素。其中比較重要的方法有equals方法,只要鍵和值相等,而且是 Map.Entry類型,那麼就能夠判斷這兩個節點是相等的;還有一個很重要的方法是hash方法。主要用到的算法就是首先得到對象的hashcode,而後把這個hashcode無符號右移16位,而且把右移前的結果和右移後的結果按位異或,獲得的hash值就是最終的結果,具體算法緣由不詳。對象
裏面還有幾個不是特別重要的方法,說不是 特別重要,其實也不是真的不重要,而是這些方法通常做爲外部人員來講,不多去使用。其中一個是comapreableClassFor方法,它帶一個參數,從外部 傳入,若是這個參數的實例實現了Comparable接口,首先判斷這個是否是String類型,若是是String類型,那麼直接返回 ;首先會獲取帶泛型的接口,若是有一個或者多個泛型接口,那麼循環去便利這個數組,若是實際類型是Comparable.class,而後判斷參數的實際類型,若是類型是Comparable.class,而且只有一參數,那麼 返回它自己。繼承
裏面還有一個tableSizeFor方法,參數是初始的容量,代碼邏輯就是無符號的右移,每行右移的倍數就是前一次的2倍,最後右移到的是2的16次方,其中參數是初始大小 。只要 在1和MAX_CAPACITY之間就好了。接口